Подразумевается ли ELSE 0 в моем утверждении COUNT CASE WHEN?


10

Какая разница между COUNT(CASE WHEN [Column A] = ____ THEN 1 END а COUNT(CASE WHEN [Column A] = ____ THEN 1 ELSE 0 END?

Я использовал первый и до сих пор не видел разницы; Что является причиной для добавления ELSE 0- существуют ли ситуации, когда SQL Server будет неправильно рассчитывать?


4
Во втором примере следует использовать SUM вместо COUNT, чтобы быть верным.
Оливье Жако-Дескомб

Ответы:


23

Достаточно просто в первом случае вы считаете 1 и NULL. (Возвращается NULL, если ни одно из условий в операторе CASE не совпадает, а предложение ELSE отсутствует.) Значения NULL не учитываются. Во втором случае 1 и 0. 0 можно посчитать.

Быстрый пример:

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;

Вывод:

введите описание изображения здесь


9

Если вы не указываете инструкцию else для оператора case, он по умолчанию вернет NULL, и в вашем случае это хорошо, потому что count будет считать значения, отличные от NULL. Если вы возвращаете что-то еще из регистра, не имеет значения, равен ли он 1, 0 или 2, он всегда будет учитываться как 1.

Если бы вы использовали сумму вместо количества, вы должны вернуть 1 или 0.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.