我需要计算一个表中每种类型有多少行。但是,即使没有相关的行,我仍然需要在结果集中显示每种类型,并且它是计数器。如果没有相关行,则计数器将为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;
仅当在指定日期有Student_type为10或12的行时,当前SQL返回结果,但是如果没有行,则不返回任何内容。
我需要结果将始终采用以下形式:
student_type count
10 0
12 0
答案 0 :(得分:0)
-创建2个数据集表a(您要显示的所有样式类型) -和表b(每种类型的计数) -然后从表a中选择所有内容,然后将外部联接留给b,这意味着如果b中没有对应的记录,那么您将得到NULL(可以将其转换为0)
从
中选择a.student_type,ISNULL(b.cnt,0)作为“计数”( SELECT distinct student_type FROM students WHERE student_type IN (10, 12) ) a
左外部联接
(从学生中将学生类型IN(10,12)和registration_time在'2018-1-1'和'2018-12-31'GROUP BY student_type之间的学生中选择``student_type,COUNT(*)作为'cnt')b 在a.student_type = b.student_type;
上答案 1 :(得分:0)
请考虑条件聚合,将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;
答案 2 :(得分:0)
对我来说,使用左联接
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;