这是我的原始查询:
SELECT CAST(IndexedDate as varchar), COUNT(*) AS Logins FROM Table WHERE EventType = 'Login' AND IndexedDate > DATEADD(mm, -1, GETDATE()) GROUP BY IndexedDate ORDER BY IndexedDate DESC
这将留下空白,例如:
2016-09-13 41 2016-09-12 31 2016-09-09 15 2016-09-08 36
基于这个问题,我尝试了以下方法,但仍然存在差距,但最重要的是,结果是错误的(数字高出很多):
SELECT CAST(IndexedDate as varchar), SUM(Case When COUNT(*) Is Null Then 0 Else COUNT(*) End) AS Logins FROM ...
我怎样才能使结果看起来像这样?
2016-09-13 41 2016-09-12 31 2016-09-11 0 2016-09-10 0 2016-09-09 15 2016-09-08 36
我已经检查了其他几个问题,但它们都涉及联接或我的场景中未涉及的其他因素。
更新
根据评论,我尝试了OUTER JOIN。此迭代最终成功运行,但结果有些倒退…
OUTER JOIN
SELECT CAST(a.IndexedDate as varchar) as dt, COUNT(*) AS Logins FROM ( SELECT * FROM Table WHERE IndexedDate > DATEADD(mm, -1, GETDATE()) AND EventType = 'Login' ) a FULL OUTER JOIN ( SELECT DISTINCT(IndexedDate) FROM Table WHERE IndexedDate > DATEADD(mm, -1, GETDATE()) ) b ON a.IndexedDate = b.IndexedDate GROUP BY b.IndexedDate ORDER BY b.IndexedDate DESC
结果:
2016-09-13 41 2016-09-12 31 (null) 1 (null) 1 2016-09-09 15 2016-09-08 36
我确认汇总中b包括缺少的日期。
b
因此,我将汇总内容从编辑内容切换到我的原始帖子,现在可以正常工作了:
询问
SELECT CAST(a.IndexedDate as varchar) as dt, COUNT(EventType) AS Logins FROM ( SELECT DISTINCT(IndexedDate) FROM Table WHERE IndexedDate > DATEADD(mm, -1, GETDATE()) ) a FULL OUTER JOIN ( SELECT * FROM Table WHERE IndexedDate > DATEADD(mm, -1, GETDATE()) AND EventType = 'Login' ) b ON a.IndexedDate = b.IndexedDate GROUP BY a.IndexedDate ORDER BY a.IndexedDate DESC
结果
请注意,我必须替换为COUNT(*),COUNT(EventType)这样它才不会从合计中计算得出1的日期。
COUNT(*)
COUNT(EventType)