SQL - 如果不存在组,则返回0

时间:2014-07-02 19:05:21

标签: sql

我有一个汇总表,用于汇总给定小时的原始数据。它看起来像这样:

stats_hours:
- obj_id : integer
- start_at : datetime
- count : integer

obj_id指向一个单独的表,start_at字段包含数据小时开始的时间戳,count包含该小时数据的总和。

我想构建一个每天返回一组数据的查询,如下所示:

Date       | sum_count
2014-06-01 | 2000
2014-06-02 | 3000
2014-06-03 | 0
2014-06-04 | 5000

我构建的查询在日期列上进行分组并总结计数:

SELECT date(start_at) as date, sum(count) as sum_count 
FROM stats_hours GROUP BY date;

除非我没有给定日期的数据,否则这样可以正常工作,在这种情况下它显然会遗漏该行:

Date       | sum_count
2014-06-01 | 2000
2014-06-02 | 3000
2014-06-04 | 5000

在没有给定日期组的数据的情况下,有没有人知道在SQL中返回归零行的好方法?也许某种案例陈述?

1 个答案:

答案 0 :(得分:4)

您需要先填写完整的日期列表,然后将该列表连接到您的可用日期并按此分组。请尝试以下方法:

--define start and end limits
Declare @todate datetime, @fromdate datetime
Select @fromdate='2009-03-01', @todate='2014-06-04'

;With DateSequence( Date ) as
(
    Select @fromdate as Date
        union all
    Select dateadd(day, 1, Date)
        from DateSequence
        where Date < @todate
)

--select result
SELECT DateSequence.Date, SUM(Stats_Hours.Count) AS Sum_Count
FROM 
    DateSequence 
     LEFT JOIN 
    Stats_Hours ON DateSequence.Date = Stats_Hours.Start_At
GROUP BY DateSequence.Date
option (MaxRecursion 0)

编辑:来自this post的CTE代码