3

我正在为数据立方体设计事实表,并且我有一个我真的不知道如何正确聚合的度量。以下 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,对 BLUE 计数贡献 1。

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

(我尝试使用这个网络应用程序创建一个表格,但间距似乎不正确。希望它的可读性足以理解。)

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

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

4

3 回答 3

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,事实表中具有颜色“PATRIOTIC”的行已经是具有相同 ID 和其他颜色值的其他行的聚合。

于 2012-08-09T14:27:49.583 回答
0

不完全确定为什么您的事实表需要是“ID”和“颜色”之间的交叉连接。您可以简单地消除所有 Flag=0 行并使用 ID 列的简单计数作为您的 Patriotic 度量,不同的计数将为您提供 Patriotic 行的总数。

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

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

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)
于 2012-08-03T01:59:19.733 回答
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,对 BLUE 计数贡献 1。

select a.Color, COUNT(*)
from FactTable a
    join ColorDim b
    on a.Color = b.Color
where Flag = 1
group by a.Color
于 2012-08-02T01:22:20.600 回答