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

dfddblmv  于 2021-06-15  发布在  Mysql
关注(0)|答案(3)|浏览(238)

我需要计算表中每种类型有多少行。但是,即使没有相关的行,我仍然需要在结果集中显示每个类型及其计数器。如果没有相关行,计数器将为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\类型为10或12的行时,当前sql才会返回结果,但如果没有行,则不会返回任何结果。
我需要结果总是这样:

student_type    count
 10               0
 12               0
txu3uszq

txu3uszq1#

--创建两个数据集表a(所有要显示的stydent类型)和表b(每种类型的计数),然后从表a中选择所有内容,然后将outer join保留到b,这意味着如果b中没有相应的记录,则会得到null(可以将其转换为0)
从中选择a.student类型isnull(b.cnt,0)作为“count”

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

左外连接
(选择学生类型,按学生类型将(*)计算为“cnt”,其中学生类型为(10,12),注册时间为“2018-1-1”和“2018-12-31”之间的组;)b on a.student\u type=b.学生类型;

mzillmmw

mzillmmw2#

我用左连接就行了

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;

或使用“on the fly”左连接:

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;
inkz8wg9

inkz8wg93#

考虑条件聚合,在其中移动 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;

相关问题