Что-то странное с группировкой SQL серверов - PullRequest
0 голосов
/ 10 июля 2020

У меня вопрос, что происходит с group by.

Например:

select COUNT(*)
from 
    (select 0 c1) t1
where 0 = 1
group by t1.c1

Результат - нет записей

select COUNT(*)
from  
    (select 0 c1) t1
where 0 = 1
--group by t1.c1

Результат - 0

Почему?!?!

Ответы [ 2 ]

1 голос
/ 10 июля 2020

Когда вы фильтруете по WHERE 0 = 1, никакие строки не будут соответствовать фильтру.

Если вы также не добавляете группу по инструкции, все строки из этой таблицы будут рассматриваться как 1 группа. Таким образом, количество результатов будет равно 0 - для группы есть 0 строк, соответствующих фильтру.

Когда вы добавляете столбец группирования, SQL Сервер должен делать то же количество, но теперь сгруппировано по каждому отдельному значению этот столбец. Поскольку ваш фильтр не возвращает никаких значений для столбцов группировки, группировать не нужно. Таким образом, в результате нет записей.

Таким образом, разница между двумя группами составляет 0 групп против 1 группы. Нет результата против результата.

0 голосов
/ 10 июля 2020

Запрос агрегирования без GROUP BY всегда возвращает одну строку. Когда все строки отфильтрованы, большинство значений в строке - NULL. Исключением являются значения COUNT(), которые равны 0.

Запрос агрегирования с GROUP BY возвращает одну строку для каждой комбинации значений. Когда все строки отфильтрованы, групп нет, поэтому ничего не возвращается.

Ваш первый запрос имеет GROUP BY, но отфильтровывает все строки. Следовательно, никаких строк. Второй запрос не имеет GROUP BY, поэтому возвращается одна строка.

...