数据立方体设计:难以聚合的度量

时间:2012-08-01 15:20:16

标签: sql sql-server sql-server-2008 ssas

我正在为数据立方体设计事实表,我有一个我不知道如何正确聚合的度量。以下SQL代码将创建一个小样本事实表和维度表:

create table FactTable (
    ID      int,
    Color   int,
    Flag    int)

insert into FactTable (ID, Color, Flag) values (1, 'RED',   1)
insert into FactTable (ID, Color, Flag) values (1, 'WHITE', 0)
insert into FactTable (ID, Color, Flag) values (1, 'BLUE',  1)
insert into FactTable (ID, Color, Flag) values (2, 'RED',   0)
insert into FactTable (ID, Color, Flag) values (2, 'WHITE', 0)
insert into FactTable (ID, Color, Flag) values (2, 'BLUE',  1)
insert into FactTable (ID, Color, Flag) values (3, 'RED',   1)
insert into FactTable (ID, Color, Flag) values (3, 'WHITE', 1)
insert into FactTable (ID, Color, Flag) values (3, 'BLUE',  1)

create table ColorDim (
    CID     int, 
    Color  int)

insert into ColorDim (CID, Color) values (1, 'RED')
insert into ColorDim (CID, Color) values (2, 'WHITE')
insert into ColorDim (CID, Color) values (3, 'BLUE')

FactTable和ColorDim在FactTable.Color = ColorDim.Color上连接。在立方体中,应该有一个称为“爱国”的度量,它计算对象ID,包括红色,白色或蓝色(至少一种颜色)。所需的输出如下:

  • 当浏览立方体时,如果用户拉入爱国测量(不拉动尺寸),则显示的总数应为2,因为有2个ID(即1和3),其中至少包含三种颜色中的一种。请注意,ID 1应该对总爱国值贡献1,即使它有两种颜色。
  • 如果用户通过“颜色”维度浏览“爱国”度量,则应该看到如下表格。请注意,ID 1为RED计数提供1,为蓝色计数提供1。

    + -------- + ----------- +
    |颜色|爱国|
    + -------- + ----------- +
    | RED | 2 |
    |白色| 1 |
    |蓝色| 2 |
    + -------- + ----------- +

(我尝试使用this web app创建一个表格,但间距似乎不正确。希望它的可读性足以理解。)

我确信这是一个非常基本的多维数据集设计情况,但我之前没有使用多维数据集,我使用的度量通常是列的简单SUM,或列的SUM等产品。任何帮助将不胜感激。

(如果相关,我正在运行在MS SQL Server 2008中构建事实/维度表的SQL查询,我将在MS Visual Studio 2008中设计多维数据集。)

3 个答案:

答案 0 :(得分:0)

我会试一试,虽然我不是100%肯定我理解这些问题。此外,我不想在评论中发布查询以验证它们是否有效。如果我离开了,这没有帮助,我会删除答案。

  

当浏览立方体时,如果用户拉入爱国测量(不拉动尺寸),则显示的总数应为2,因为有2个ID(即1和3)包括三种颜色中的至少一种。请注意,ID 1应该对总爱国值贡献1,即使它有两种颜色。

WITH MyCTE (id, Count)
AS
(
select id, count(flag) as count
from FactTable
where Flag=1
group by id
having COUNT(flag) >=2
)
select COUNT(*) from MyCTE
  

如果用户按颜色维度浏览爱国测量,他们应该看到如下表格。请注意,ID 1为RED计数提供1,为蓝色计数提供1。

select a.Color, COUNT(*)
from FactTable a
    join ColorDim b
    on a.Color = b.Color
where Flag = 1
group by a.Color

答案 1 :(得分:0)

不完全确定为什么Fact表需要是“ID”和“Color”之间的交叉连接。您可以简单地消除所有Flag = 0行并使用ID列的简单计数作为您的爱国测量,一个独特的计数将为您提供爱国行的总数。

您也不需要Color维度,因为ColorDim表没有提供额外信息。

但是,如果向行添加了更多颜色,则可以将“Patriotic”标志添加到ColorDim表中。然后,任何查询都可以通过“爱国”标志进行过滤,并且仍可获得爱国行的准确计数。

create table FactTable (
    ID      int,
    Color   int
    )

insert into FactTable (ID, Color) values (1, 'RED')
insert into FactTable (ID, Color) values (1, 'BLUE')
insert into FactTable (ID, Color) values (2, 'BLUE')
insert into FactTable (ID, Color) values (3, 'RED')
insert into FactTable (ID, Color) values (3, 'WHITE')
insert into FactTable (ID, Color) values (3, 'BLUE')

   create table ColorDim (
        CID     int, 
        Color  int,
        PatrioticFlag int
    )

insert into ColorDim (CID, Color) values (1, 'RED',1)
insert into ColorDim (CID, Color) values (2, 'WHITE',1)
insert into ColorDim (CID, Color) values (3, 'BLUE',1)
insert into ColorDim (CID, Color) values (4, 'BEIGE',0)

答案 2 :(得分:0)

我终于明白了。首先,我为每个ID添加了一行到包含该ID的预聚合数据的事实表,因此事实表变为:

create table FactTable (
    ID      int,
    Color   int,
    Flag    int)

insert into FactTable (ID, Color, Flag) values (1, 'RED',   1)
insert into FactTable (ID, Color, Flag) values (1, 'WHITE', 0)
insert into FactTable (ID, Color, Flag) values (1, 'BLUE',  1)
insert into FactTable (ID, Color, Flag) values (1, 'PATRIOTIC',  1)
insert into FactTable (ID, Color, Flag) values (2, 'RED',   0)
insert into FactTable (ID, Color, Flag) values (2, 'WHITE', 0)
insert into FactTable (ID, Color, Flag) values (2, 'BLUE',  1)
insert into FactTable (ID, Color, Flag) values (2, 'PATRIOTIC',  1)
insert into FactTable (ID, Color, Flag) values (3, 'RED',   1)
insert into FactTable (ID, Color, Flag) values (3, 'WHITE', 1)
insert into FactTable (ID, Color, Flag) values (3, 'BLUE',  1)
insert into FactTable (ID, Color, Flag) values (3, 'PATRIOTIC',  1)

同样,在颜色维度表中添加一行:

create table ColorDim (
    CID     int, 
    Color  int)

insert into ColorDim (CID, Color) values (1, 'RED')
insert into ColorDim (CID, Color) values (2, 'WHITE')
insert into ColorDim (CID, Color) values (3, 'BLUE')
insert into ColorDim (CID, Color) values (4, 'PATRIOTIC')

然后,在MS Visual Studio中,将Color Dimension中Color属性的DefaultMember属性编辑为:

[Color Dimension].[ColorDim].&[PATRIOTIC]

DefaultMember属性告诉MS Visual Studio,具有Color'PATRIOTIC'的事实表的行已经是具有相同ID和其他Color值的其他行的聚合。