# MSSQL Probleme bei NULL und COUNT



## volker2 (15. August 2006)

Hallo,

folgender SQL Aufruf:
---schnipp---
SELECT server,count(*) AS Anzahl FROM table WHERE confirm IS NULL GROUP BY server
---schnapp---

Resultat ist, das ich zu allen eingetragen Servern bei denen NULL in der confirm Spalte eingetragen ist die Anzahl dieser NULL Eintraege erhalte.

Allerdings will ich auch die Namen der anderen Server erhalten, bei denen kein NULL Eintrag vorhanden ist. Bei diesen soll einfach "0" in der count(*) Spalte zurueckgegeben werden.

Allerdings schaffe ich nicht ISNULL hier einzubauen und komme auch mit google etc. weiter. Wie kann ich das ganze bewerkstelligen und alle Server sehen?

Danke,
 Volker


----------



## ripkens (15. August 2006)

```
SELECT server,count(*) AS Anzahl FROM table GROUP BY server,confirm
```


----------



## volker2 (16. August 2006)

ripkens hat gesagt.:
			
		

> ```
> SELECT server,count(*) AS Anzahl FROM table GROUP BY server,confirm
> ```



Da fehlt Eindeutig das "WHERE confirm IS NULL" und selbst mit dem geaenderten GROUP BY tut es nicht.

Gruss,
 Volker


----------



## ripkens (16. August 2006)

Wenn du das where rein nimmst, KANN er NUR Zeilen finden die NULL sind. Also muss das where definitiv weg, weil du willst ja beide zahlen haben....

Das group macht das gleiche wie vorher, nur das du pro server 2 zeilen bekommst, einmal mit dem zähler für NULL und einmal für den zähler <> NULL

Eigentlich ist es genau das was du haben wolltest, ansonsten beschreibe dein problem nochmal etwas genauer...

Marcus


----------



## volker2 (16. August 2006)

ripkens hat gesagt.:
			
		

> Wenn du das where rein nimmst, KANN er NUR Zeilen finden die NULL sind. Also muss das where definitiv weg, weil du willst ja beide zahlen haben....
> 
> Das group macht das gleiche wie vorher, nur das du pro server 2 zeilen bekommst, einmal mit dem zähler für NULL und einmal für den zähler <> NULL
> 
> Eigentlich ist es genau das was du haben wolltest, ansonsten beschreibe dein problem nochmal etwas genauer...



Zwei Zeilen sind kein Problem, allerdings ist das ganze auch noch von anderen Spalten abhaengig, genauer noch von einer. Ich habe drei Spalten die es zu beachten gibt:
computername || ErrorTypeName || confirm

Dabei will ich bei allen Servern die bei denen in ErrorTypeName "Error event" steht die jeweiligen Servernamen mit der Anzahl der NULL (d.h. keine Werte) in der confirm Spalte haben.

Nehme ich nun
---schnipp---
"SELECT computername,count(*) AS Anzahl FROM tab_raw
 WHERE EventTypeName='Error event' GROUP BY computername,confirm"
---schnapp---
erhalte ich natuerlich die Abzaehlung der EventTypeName Spalte auf die WHERE Definition.

Am optimalsten waer eine Rueckgabe
"||<servername>||<#NULL in confirm>||<# !NULL in confirm>||"
sofern das einfach und verstaendlich in SQL zu implementieren ist.

(Perl-)Skriptresultat soll eine Liste von   "Servername: <#NULL>/<# !NULL>" sein.

Danke & Grüsse,
 Volker


----------



## Matthias Reitinger (16. August 2006)

Hallo,

versuch's mal hiermit:

```
SELECT
  computername,
  COUNT(confirm) AS not_null_in_confirm,
  COUNT(*) - COUNT(confirm) AS null_in_confirm
FROM tab_raw
WHERE EventTypeName = 'Error event'
GROUP BY computername
```
Bin allerdings mit MSSQL nicht sonderlich vertraut, also könnten noch kleinere Anpassungen nötig sein.

Grüße,
 Matthias


----------



## volker2 (17. August 2006)

Matthias Reitinger hat gesagt.:
			
		

> versuch's mal hiermit:
> 
> ```
> SELECT
> ...



Klappt. Vielen, vielen Dank! Wusste garnicht das man an der Stelle eine arithmetische Berechnung durchfuehren kann. Wieder etwas dazu gelernt.

Der unterschied von MSSQL zu MySQL (genauso wie MySQL und Postgres etc) liegt nur daran das meistens einzelne Funktionen nicht gleich bzw. vorhanden sind und es in seltenen Faellen Probleme mit der Syntax gibt (z.B. bei NULL geht bei MSSQL "EventTypeName = NULL", was allerdings bei anderen SQL DB's geht).

Gruss,
 Volker


----------

