汇总总计并创建数周,没有数据存在

时间:2014-06-20 20:54:42

标签: sql sql-server sql-server-2008-r2

我有一张这样的表:

Region     Date        Cases
France     1-1-2014      5
Spain      2-5-2014      6
France     3-5-2014      7
...

我想要做的是运行这样的聚合函数,对每个区域的案例总数进行分组。

    select region, datepart(week, date) weeknbr, sum(cases) cases
    from <table>
    group by region, datepart(week, date)
    order by region, datepart(week, date)

使用这个聚合函数,当那个星期不存在数据时,有没有办法为每个区域插入一个零值?

所以最终结果如下:

region      weeknbr      cases
France      1            5
France      2            0
France      3            0
.....
Spain       1            0
Spain       2            0 
Spain       3            0
....        
Spain       8            6

我尝试创建一个包含周数的表,然后将周数加入我的数据,但一直没有成功。这最终会为区域和案例创建null或零值。我总是可以使用isnull函数来设置案例0,但我需要考虑每周的每个区域。那是什么现在杀了我。这可能吗?如果没有,我应该在哪里开始查看,我应该如何修改下划线表?

非常感谢任何帮助。谢谢

2 个答案:

答案 0 :(得分:2)

如果我理解你的意思正确,你总是可以生成人工行,在分组区域交叉连接以获得0的完整性,然后在区域和周上加入聚合表。所以:

select r.region, w.RowId as Weeknbr, isnull(c.Cases,0)
from (
    select row_number()over(order by name) as RowID
    from master..spt_values
    ) w
    cross join (
        select region
        from <table>
        group by region
    ) r
    left join 
        select region, datepart(week, date) weeknbr, sum(cases) cases
        from <table>
        group by region, datepart(week, date)
        order by region, datepart(week, date)
    ) c on (w.RowID <= 53 and w.RowID = c.Weeknbr and r.region = c.region)

答案 1 :(得分:0)

您需要一个date_list表一个region_list表。交叉连接维度表以获取所有日期 - 区域组合,然后将左连接保留在事实表中。

SELECT
  d.date,
  r.region,
  t.cases
FROM date_list d
CROSS JOIN region_list r
LEFT JOIN date_region t ON d.date = t.date AND r.region = t.region