¿Está ELSE 0 implícito en mi declaración COUNT CASE WHEN?

10

¿Cuál es la diferencia entre COUNT(CASE WHEN [Column A] = ____ THEN 1 END y COUNT(CASE WHEN [Column A] = ____ THEN 1 ELSE 0 END?

He estado usando el primero y no he visto la diferencia hasta ahora; ¿Cuál es la razón para agregar el ELSE 0- hay situaciones donde SQL Server contará incorrectamente?

Coburne
fuente
44
El segundo ejemplo debe usar SUM en lugar de COUNT para ser correcto.
Olivier Jacot-Descombes

Respuestas:

23

Simplemente, en el primer caso, está contando 1s y NULLs. (Se devuelve NULL si ninguna de las condiciones en la declaración CASE coincide y no hay una cláusula ELSE). Los NULL no se cuentan. En el segundo caso, 1 y 0. Se pueden contar los 0.

Ejemplo rápido:

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;

Salida:

ingrese la descripción de la imagen aquí

Kenneth Fisher
fuente
9

Si no está especificando la parte else para la declaración de caso, devolverá NULL de forma predeterminada, y en su caso eso es algo bueno, porque count contará los valores no NULL. Si devuelve algo más de mayúsculas y minúsculas, no importa si es 1, 0 o 2, siempre se contará como 1.

Si usaría la suma en lugar del conteo, entonces debería devolver 1 o 0.

James Z
fuente