sql语句中如何将查询没有的记录也显示在查询结果中,显示为0

用如下代码查询表中数据
select defectClass, count(*)
from qua_particle_iis_his
where defectClass in (1, 2, 3, 4, 5, 6)
and virtualCode = '122009200013'
Group by defectClass

显示结果如下:

img

其中2和4 因为没有记录。 但是我需要显示出来。

想要的显示出的结果是

img


select defectClass, sum(case when defectClass in (1, 2, 3, 4, 5, 6) and virtualCode = '122009200013' then 1 else 0 end) as cnt
from qua_particle_iis_his
Group by defectClass

说下数据库类型及版本,这个最好是用递归或者表函数来构造一个虚拟表,但有的数据库不支持。
另外,如果不用递归,那就得手动虚拟一个表,包含有全部的值,再外关联你这个数据,比如

SELECT
    t.defectClass,
    ifnull( s.ct, 0 ) ct 
FROM
    ( SELECT 1 defectClass UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 ) t
    LEFT JOIN (
SELECT
    defectClass,
    count( * ) ct 
FROM
    qua_particle_iis_his 
WHERE
    defectClass IN ( 1, 2, 3, 4, 5, 6 ) 
    AND virtualCode = '122009200013' 
GROUP BY
    defectClass 
    ) s ON t.defectClass = s.defectClass
select * from (
select defectClass, count(*) as ct
from qua_particle_iis_his
where defectClass in (1, 2, 3, 4, 5, 6)
and virtualCode = '122009200013'
Group by defectClass
) t where t.ct>0

外层加一个嵌套条件

defectClass 这个字段的值,如果是其他表的字段的数据,那left join是可以做到(分清谁连谁,left join才起作用),没有就自己业务代码自己去补数据