按所有列的计数为0的多列分组

时间:2019-09-09 12:11:22

标签: sql sql-server group-by aggregate

我有一个查询,如果在group by上没有找到记录,它必须返回0。但是我得到的结果是空的。

SELECT DATEPART(YEAR, s.CreatedAt) AS 'Year',DATEPART(MONTH, s.CreatedAt) AS 
'Month', count(*) AS 'count'
FROM table1 t1
JOIN table2 t2 on t1.id = t2.id
WHERE t1.Id IN (
SELECT id FROM table3 WHERE Id IN (
SELECT id FROM table4 WHERE Gradingresult LIKE '%abcd%'
GROUP BY id
)) AND t1.column1 LIKE 'hello' AND t1.column2='world' AND t2.column1 != 
'somestring' 
AND t1.CreatedAt BETWEEN  DATEADD(YEAR, -1, GETDATE()) AND GETDATE() 
GROUP BY DATEPART(YEAR, t1.CreatedAt), DATEPART(MONTH, t1.CreatedAt)

我希望它显示如下,

    year month      count
    2019    2         0
    2019    4         0
    2018    7         0

但是我得到的结果如下

    year   month    count

这里什么也没有行。

我尝试了不同的方式,例如case语句,isnull(),左联接和其他方法,但无法获得预期的结果

编辑 我也考虑过一年 我已更新了实际查询,如果不包含 t2.column1 条件,我将获得低于结果的结果

    year  month   count
    2019  5        10
    2019  4        25
    2019  2         9
    2018  10       19        

如果我包含上述指定条件,我应该得到预期的结果

1 个答案:

答案 0 :(得分:0)

如果表中没有行,则结果集中没有行。您可以使用left join来获取所需的行:

select v.mon, count(t.createdat)
from (values (2), (4), (7)) v(mon) left join
     tableT t
     on month(t.createdat) = v.mon
group by v.mon
order by v.mon;

在使用此表述时,您需要非常小心,因为您没有包括年份。在使用几个月时,通常也应该考虑年份。