SQL聚合基于表中的维度

时间:2013-10-13 16:44:29

标签: sql sql-server-2008 aggregation

使用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结果集。

1 个答案:

答案 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