我正在尝试编写一个 SQL Server 查询,它也应该返回零计数记录。我知道聚合函数会忽略 NULL 值。
SELECT
DAY(job_start_date) as day,
count(app_id) as execution
FROM job_application_details
WHERE
job_start_date >= DATEADD(day, -30, GETDATE())
and job_start_date <= getdate()
and app_id = 51
group by DAY(job_start_date);
以上查询返回如下结果:
| day | execution
-------+------+--------------
1 | 9 | 1
2 | 12 | 1
3 | 15 | 1
4 | 30 | 1
因为在其他日子里,表中没有记录,所以它不会以 0 计数返回它。因此,我想编写一个查询,返回 30 天的记录,包括执行次数为 0 的记录。
请帮忙解决这个问题。提前致谢。
答案 0 :(得分:0)
这里的问题是您需要一个包含您期望的完整日期集的表,一个日历,以便您可以执行 LEFT JOIN。然后你可以这样写:
SELECT c.date,
SUM(IIF(d.job_start_date IS NULL, 0, 1)) AS execution
FROM calendar c
LEFT JOIN job_application_details d
ON c.date = d.job_start_date
WHERE c.date BETWEEN DATEADD(day, -30, GETDATE()) AND GETDATE()
AND d.app_id = 51
GROUP BY c.date
如果您还没有将日历表加载到数据库中,本post 概述了一些创建日历表的简单方法。
答案 1 :(得分:0)
假设你的表每天都有数据——只是不是 app = 51,你可以使用条件聚合:
SELECT DAY(job_start_date) as day,
SUM(CASE WHEN appid = 51 THEN 1 ELSE 0 END) as execution
FROM job_application_details
WHERE job_start_date >= DATEADD(day, -30, GETDATE()) AND
job_start_date <= getdate()
GROUP BY DAY(job_start_date);
否则,您需要一个日历表、计数表,或者使用递归 CTE 等方法生成日期。