查询返回 count(*) 为零的行

时间:2021-04-29 02:42:48

标签: sql sql-server tsql

我正在尝试编写一个 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 的记录。

请帮忙解决这个问题。提前致谢。

2 个答案:

答案 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 等方法生成日期。

相关问题