【发布时间】:2017-01-24 18:24:39
【问题描述】:
这是我原来的查询:
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
基于this question,我尝试了以下方法,但仍然收到了差距,但最重要的是结果是错误的(数字要高得多):
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
我检查了其他一些问题,但它们都涉及联接或其他不属于我的场景的因素。
更新
基于 cmets,我尝试了 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 包括缺失的日期。
【问题讨论】:
-
与日历表的外部联接(保存所有可能的日期)。
-
啊,有道理。我希望有一个更简单的方法,但我想你不能从无到有。
-
跟随@jarlh 的评论,SQL 查询非常适合获取现有信息并将其转换为您想要的内容。但是在您的情况下,如果确实缺少日期数据,那么日历表是引入该数据的好方法。
-
实际上,您使用 SQL Server 中的stackoverflow.com/questions/11141507/… 之类的技术即时创建日期列表。该表
n可以在日期与您的表连接,以便在需要时获取 count(*)。 -
回滚标签更改,因为 DBMS总是 相关...
标签: sql count null group-by intersystems-cache