Czy ELSE 0 jest dorozumiane w moim wyciągu COUNT CASE WHEN?

10

Jaka jest różnica między COUNT(CASE WHEN [Column A] = ____ THEN 1 END i COUNT(CASE WHEN [Column A] = ____ THEN 1 ELSE 0 END?

Korzystałem z tego pierwszego i do tej pory nie widziałem różnicy; jaki jest powód dodania ELSE 0- czy są sytuacje, w których SQL Server będzie niepoprawnie liczyć?

koburne
źródło
4
Drugi przykład powinien używać SUMY zamiast COUNT, aby był poprawny.
Olivier Jacot-Descombes

Odpowiedzi:

23

Po prostu w pierwszym przypadku liczysz 1s i NULLs. (NULL jest zwracane, jeśli żaden z warunków instrukcji CASE nie jest zgodny i nie ma klauzuli ELSE.) Wartości NULL nie są liczone. W drugim przypadku 1 i 0. 0 można policzyć.

Szybki przykład:

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;

Wynik:

wprowadź opis zdjęcia tutaj

Kenneth Fisher
źródło
9

Jeśli nie określisz instrukcji else część do case, wówczas domyślnie zwróci NULL, aw twoim przypadku jest to dobre, ponieważ count policzy wartości inne niż NULL. Jeśli zwrócisz cokolwiek innego z przypadku, nie ma znaczenia, czy będzie to 1, 0 czy 2, zawsze będzie liczony jako 1.

Jeśli użyjesz sumy zamiast zliczania, powinieneś zwrócić 1 lub 0.

James Z
źródło