ELSE 0 está implícito na minha declaração COUNT CASE WHEN?

10

Qual é a diferença entre COUNT(CASE WHEN [Column A] = ____ THEN 1 END e COUNT(CASE WHEN [Column A] = ____ THEN 1 ELSE 0 END?

Eu tenho usado o primeiro e não vi a diferença até agora; qual é o motivo da adição de ELSE 0- existem situações em que o SQL Server contará incorretamente?

coburne
fonte
4
O segundo exemplo deve usar SUM em vez de COUNT para estar correto.
Olivier Jacot-Descombes

Respostas:

23

Simplesmente, no primeiro caso, você está contando 1s e NULLs. (NULL é retornado se nenhuma das condições na instrução CASE corresponder e não houver cláusula ELSE.) NULLs não são contados. No segundo caso, 1 e 0. Os zeros podem ser contados.

Exemplo 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;

Resultado:

insira a descrição da imagem aqui

Kenneth Fisher
fonte
9

Se você não especificar a instrução else part to case, ela retornará NULL por padrão e, no seu caso, isso é bom, porque count contará os valores que não são NULL. Se você retornar qualquer outra coisa do caso, não importa se é 1, 0 ou 2, sempre será contado como 1.

Se você usasse soma em vez de contagem, retornaria 1 ou 0.

James Z
fonte