【问题标题】:group by multiple columns having count 0 for all按所有计数为 0 的多列分组
【发布时间】:2019-09-09 12:11:22
【问题描述】:

我有一个查询,如果在 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()、left join 等,但都无法得到想要的结果

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

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

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

【问题讨论】:

标签: sql sql-server group-by aggregate


【解决方案1】:

如果表中没有行,则结果集中没有行。您可以使用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;

你需要非常小心这个公式,因为你没有包括年份。在处理月份时,您通常也应该考虑年份。

【讨论】:

  • 我也在考虑年份,但我没有指定问题,但仍然得到空结果
  • @JyothiPrakash 。 . .这不能返回带有left join 的空结果。
  • 感谢您根据您的建议进行了一些修改后它工作了
猜你喜欢
  • 1970-01-01
  • 2011-03-13
  • 1970-01-01
  • 2017-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-22
相关资源
最近更新 更多