【发布时间】:2012-08-01 15:20:15
【问题描述】:
我正在为数据立方体设计事实表,并且我有一个我真的不知道如何正确聚合的度量。以下 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 |
+--------+------------+
(我尝试使用this web app 创建表格,但间距似乎不正确。希望它的可读性足以理解。)
我确信这是一个非常基本的多维数据集设计情况,但我之前没有过多地使用多维数据集,我使用的度量通常是简单的列 SUM 或列 SUM 的乘积等。任何帮助将不胜感激。
(如果相关,我将在 MS SQL Server 2008 中运行用于构建事实/维度表的 SQL 查询,并将在 MS Visual Studio 2008 中设计多维数据集本身。)
【问题讨论】:
-
你能发布一个期望结果的样本吗?很难从单词问题中破译。
-
这不是主题,但我只是想指出,事实表具有维度表的代理键而不是实际值(例如“RED”)是一种更好的做法, WHITE'等。您应该获得更好的性能,如果您决定重命名其中一个维度值,您将不必更新事实。所以 FactTable 应该有 CID vs. Color。
-
+1 Dmitriy 你打败了我。 @Andy E,为什么不在事实表中存储 CID 而不是 Color?此外,CID 可以是 smallint 或 tinyint。事实表应尽可能精简,因为它通常有数百万或数十亿行。
-
事实表将链接到 int 或 smallint ID 上的维度表,而不是 varchar 值。出于示例的目的,我只是希望事实表尽可能清楚地包含所有信息。
标签: sql sql-server sql-server-2008 ssas