使用SQL Server 2008。
我有一个分组维度表,如下所示
Group | Dim1 | Dim2 | ...
1 1 A
1 1 B
2 1 B
3 NULL C
4 2 NULL
我然后有一个像
这样的事实表Amount | Dim1 | Dim2 | ...
100 1 A
280 2 NULL
130 1 NULL
170 1 C
我想根据组表中的维度组聚合事实表中的金额。使用GROUP BY CUBE,它为不需要的维度组合生成许多行的方式。
预期结果集就像
Amount | Group | Dim1 | Dim2 | ...
300 1 1 A
200 1 1 B
400 2 1 B
1000 3 NULL C
100 4 2 NULL
从事实表汇总金额。 SQL Fiddle link示例显示了我想要仅限于示例中DimGroups表中的dimesnion值组的GROUP BY CUBE结果集。
答案 0 :(得分:0)
您可以将多维数据集的结果加入DimGroup
表。
有两个问题。处理null的处理相当简单。处理null的多重含义稍微困难一些。幸运的是,有一个Grouping
函数可以区分底层空值和多维数据集添加的空值。
这个答案假设你在DimGroup中有一个你想要多维数据集含义的空值 - 即聚合超过任何基础值。
Select
d.GroupId,
d.Dim1,
d.Dim2,
d.Dim3,
total
From (
Select
sum(Amount) total,
Dim1,
Dim2,
Dim3
From
FactTable
Group By
Cube(Dim1,Dim2,Dim3)
Having -- exclude underlying values with unknown (null) dims
(Dim1 Is Not Null or Grouping(Dim1) != 0) And
(Dim2 Is Not Null or Grouping(Dim2) != 0) And
(Dim3 Is Not Null or Grouping(Dim3) != 0)
) c
inner join
DimGroups d
on (c.Dim1 = d.Dim1 Or (c.Dim1 Is Null and d.Dim1 Is Null)) And
(c.Dim2 = d.Dim2 Or (c.Dim2 Is Null and d.Dim2 Is Null)) And
(c.Dim3 = d.Dim3 Or (c.Dim3 Is Null and d.Dim3 Is Null))
<强> SQL Fiddle 强>