即使表中没有相关数据,也为每个组强制行

时间:2019-01-07 13:51:04

标签: mysql sql

我需要计算一个表中每种类型有多少行。但是,即使没有相关的行,我仍然需要在结果集中显示每种类型,并且它是计数器。如果没有相关行,则计数器将为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

3 个答案:

答案 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;