Ist ELSE 0 in meiner COUNT CASE WHEN-Anweisung impliziert?

10

Was ist der Unterschied zwischen COUNT(CASE WHEN [Column A] = ____ THEN 1 END und COUNT(CASE WHEN [Column A] = ____ THEN 1 ELSE 0 END?

Ich habe das erstere verwendet und den Unterschied bisher nicht gesehen. Was ist der Grund für das Hinzufügen von ELSE 0- Gibt es Situationen, in denen SQL Server falsch zählt?

Coburne
quelle
4
Das zweite Beispiel sollte SUM anstelle von COUNT verwenden, um korrekt zu sein.
Olivier Jacot-Descombes

Antworten:

23

Einfach genug, im ersten Fall zählen Sie 1s & NULLs. (NULL wird zurückgegeben, wenn keine der Bedingungen in der CASE-Anweisung übereinstimmt und keine ELSE-Klausel vorhanden ist.) NULL-Werte werden nicht gezählt. Im zweiten Fall Einsen und Nullen. Nullen können gezählt werden.

Kurzes Beispiel:

CREATE TABLE #CountMe (Col1 char(1));

INSERT INTO #CountMe VALUES ('A');
INSERT INTO #CountMe VALUES ('B');
INSERT INTO #CountMe VALUES ('A');
INSERT INTO #CountMe VALUES ('B');

SELECT
    COUNT(CASE WHEN Col1 = 'A' THEN 1 END) AS CountWithoutElse,
    COUNT(CASE WHEN Col1 = 'A' THEN 1 ELSE NULL END) AS CountWithElseNull,
    COUNT(CASE WHEN Col1 = 'A' THEN 1 ELSE 0 END) AS CountWithElseZero
FROM #CountMe;

Ausgabe:

Geben Sie hier die Bildbeschreibung ein

Kenneth Fisher
quelle
9

Wenn Sie den else-Teil nicht für die case-Anweisung angeben, wird standardmäßig NULL zurückgegeben. In Ihrem Fall ist dies eine gute Sache, da count die Nicht-NULL-Werte zählt. Wenn Sie etwas anderes aus dem Fall zurückgeben, spielt es keine Rolle, ob es 1, 0 oder 2 ist, es wird immer als 1 gezählt.

Wenn Sie sum anstelle von count verwenden würden, sollten Sie 1 oder 0 zurückgeben.

James Z.
quelle