查询有关日期范围内聚合的问题

时间:2011-07-28 14:09:53

标签: sql aggregate-functions

我有一个数据集,其结构可能是这样的

yes_no          date
  0             1/1/2011
  1             1/1/2011
  1             1/2/2011
  0             1/4/2011
  1             1/9/2011

给定一个开始数据和结束日期,我想创建一个查询,它将在日期聚合,并为表中不存在的日期提供0,包括start_data和end_date之间的日期

这是在SQL中。

我很难过。我可以非常简单地获得聚合查询,但我不知道如何为表中不存在的日期获取零。

2 个答案:

答案 0 :(得分:1)

如果您正在使用支持公用表表达式的DBMS,则以下内容将生成一个日期派生表,然后您可以将其连接到表中。这是为MSSQL编写的,因此您可能需要以不同方式派生日期(即master..spt_values以外的对象)

with AllDates as (
    select top 100000 
        convert(datetime, row_number() over (order by x.name)) as 'Date' 
    from 
        master..spt_values x 
        cross join master..spt_values y
)

select
    ad.Date, isnull(yt.yn, 0)
from
    AllDates ad
    left join (
        select date, sum(yes_no) yn
        from YourTable yt
    ) yt
        on  ad.date = yt.date
where
    ad.Date between YourStartDate and YourEndDate

答案 1 :(得分:0)

生成日期必须是要走的路。

在ORACLE中你可以加入一个日期列表,为什么不加入..

(SELECT TRUNC(startdate + LEVEL) 
FROM DUAL CONNECT BY LEVEL <(enddate-startdate))

如果您无法即时生成日期 与数据库无关的解决方案是创建一个包含您将需要的所有日期并加入其中的日期。 (这应该是你最后的选择)

这是pseudeo代码,你需要用mydates替换on-the sql或date table select

SELECT 
    CASE WHEN COUNT(b.date)=0 
    THEN 
        0 
    ELSE 
        1 
    END as yes_no
FROM (mydates) a
LEFT JOIN aggtable b ON a.date=b.date