Sql 查询以返回计数(*)为零的行

Sql 查询以返回计数(*)为零的行,sql,sql-server,tsql,Sql,Sql Server,Tsql,我正在尝试编写一个SQL Server查询,它也应该返回零计数记录。我知道聚合函数忽略空值 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() an

我正在尝试编写一个SQL Server查询,它也应该返回零计数记录。我知道聚合函数忽略空值

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);
因为在其他日子,表中没有记录,所以它不会返回计数为0的记录。因此,我想写一个查询,返回30天的记录,包括执行次数为0的记录


请帮助解决此问题。提前感谢。

这里的问题是,您需要一个包含您期望的完整日期集的表,一个日历,这样您就可以执行左联接。然后你可以这样写:

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

如果尚未将日历表加载到数据库中,这将概述一些创建日历表的简单方法。

假设您的表中包含每天的数据,而不是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);
选择日期(作业开始日期)作为日期,
作为执行的总和(appid=51时为1,否则为0结束)
来自职务\申请\详细信息
其中job_start_date>=DATEADD(day,-30,GETDATE())和

作业开始日期根据问题指南,请不要发布代码、数据、错误消息等的图像-复制或在问题中键入文本。请保留图像用于图表或演示渲染错误,这是无法通过文本准确描述的。这是一个常见问题,您需要一个日历表来加入。
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);