我有一张这样的表:
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,但我需要考虑每周的每个区域。那是什么现在杀了我。这可能吗?如果没有,我应该在哪里开始查看,我应该如何修改下划线表?
非常感谢任何帮助。谢谢
答案 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