1

使用 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 链接到显示 GROUP BY CUBE 结果集的示例,我想将其限制为示例中 DimGroups 表中的维度值组。

4

1 回答 1

0

您可以将多维数据集的结果连接到DimGroup表中。有两个问题。处理加入空值相当简单。处理 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

于 2013-10-13T19:59:34.160 回答