ELSE 0 est-il impliqué dans ma déclaration COUNT CASE WHEN?

10

Quelle est la différence entre COUNT(CASE WHEN [Column A] = ____ THEN 1 END et COUNT(CASE WHEN [Column A] = ____ THEN 1 ELSE 0 END?

J'ai utilisé le premier et je n'ai pas vu la différence jusqu'à présent; quelle est la raison de l'ajout de ELSE 0- y a-t-il des situations où SQL Server ne comptera pas correctement?

coburne
la source
4
Le deuxième exemple doit utiliser SUM au lieu de COUNT pour être correct.
Olivier Jacot-Descombes

Réponses:

23

Assez simplement dans le premier cas, vous comptez 1s et NULLs. (NULL est renvoyé si aucune des conditions de l'instruction CASE ne correspond et s'il n'y a pas de clause ELSE.) Les NULL ne sont pas comptés. Dans le second cas, 1 et 0. Les 0 peuvent être comptés.

Exemple rapide:

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;

Production:

entrez la description de l'image ici

Kenneth Fisher
la source
9

Si vous ne spécifiez pas la partie else à l'instruction case, elle renverra alors NULL par défaut, et dans votre cas, c'est une bonne chose, car count comptera les valeurs non NULL. Si vous retournez autre chose de case, peu importe que ce soit 1, 0 ou 2, il sera toujours compté comme 1.

Si vous souhaitez utiliser la somme au lieu de compter, vous devez renvoyer 1 ou 0.

James Z
la source