Форсирование строки для каждой группы, даже если нет соответствующих данных в таблице - PullRequest
0 голосов
/ 07 января 2019

Мне нужно посчитать, сколько строк каждого типа существует в таблице. Но даже если нет соответствующих строк, мне все равно нужно показывать каждый тип в наборе результатов и его счетчике. Счетчик будет 0, если нет соответствующих строк.

Это мой текущий SQL:

SELECT student_type, COUNT(*) as 'count'
FROM students 
WHERE student_type IN (10, 12)
AND registration_time BETWEEN '2018-1-1' AND '2018-12-31'
GROUP BY student_type;

Текущий результат возврата SQL только в том случае, если в указанную дату есть строки с типом студента 10 или 12, но если строк нет, ничего не будет возвращено.

Мне нужно, чтобы результат всегда был в такой форме:

student_type    count
 10               0
 12               0

Ответы [ 3 ]

0 голосов
/ 07 января 2019

Рассмотрим условное агрегирование, когда вы перемещаете условие WHERE в выражение SELECT, чтобы избежать фильтрации нулевых условных записей. Ниже суммируются условия True по вашей группировке, которая равняется количеству возвращаемых нулей.

SELECT student_type, 
       SUM(student_type IN (10, 12) AND 
           registration_time BETWEEN '2018-01-01' AND '2018-12-31') as 'count'
FROM students
GROUP BY student_type;
0 голосов
/ 09 января 2019

Это работает для меня, используя левое соединение

SELECT a.student_type, count(b.student_type) 
FROM students_types a
LEFT JOIN students b ON a.student_type = b.student_type
AND b.registration_time BETWEEN '2018-1-1' AND '2018-12-31'
WHERE a.student_type in(10, 12)
GROUP BY 1;

Или с левым соединением «на лету»:

SELECT t.student_type, count(b.student_type) 
FROM (SELECT 10 student_type UNION SELECT 12) t
LEFT JOIN students b ON t.student_type = b.student_type
AND b.registration_time BETWEEN '2018-1-1' AND '2018-12-31'
GROUP BY 1; 
0 голосов
/ 07 января 2019

- создать 2 таблицы наборов данных a (все типы стилей, которые вы хотите отобразить) - и таблица b (количество для каждого типа) - и выберите все из таблицы a, когда вы затем оставили внешнее соединение с b, что означает, что если в b нет соответствующей записи, вы получите NULL (который вы можете преобразовать в 0)

ВЫБЕРИТЕ a.student_type, ISNULL (b.cnt, 0) в качестве 'count' из

( SELECT distinct student_type FROM students WHERE student_type IN (10, 12) ) a

левое внешнее соединение

(ВЫБЕРИТЕ student_type, COUNT (*) как 'cnt' ИЗ студентов, ГДЕ студента IN (10, 12) И времени регистрации МЕЖДУ '2018-1-1' И '2018-12-31' GROUP BY student_type;) b на a.student_type = b.student_type;

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...