2012-08-01 114 views
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。

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

(我试图创建使用this web app一个表,但间隔并不显得正确的。我希望这是足够的可阅读理解。)

我敢肯定,这是一个非常基本的立方体设计的情况,但我还没有与立方体以前更努力,我已经使用的措施是平时简单的算术列或SUM列的产品等。任何帮助将不胜感激。

(如果是相关的,我跑这建立在MS SQL Server 2008中的事实/维度表的SQL查询,我将设计的立方体本身在微软的Visual Studio 2008中)

+0

你可以发布所需结果的样本吗?这个词难以破译。 – Taryn 2012-08-01 16:28:09

+1

这是关闭的话题,但我只想指出,维度表的代理关键字与实际值(例如“红色”,“白色”等)相比,事实表是更好的做法。您应该获得更好的性能,并且如果您决定重命名其中一个维度值,则不必更新事实。所以FactTable应该有CID和Color。 – 2012-08-01 17:57:21

+0

+1德米特里你击败了我。 @Andy E,你为什么不在事实表中存储CID而不是Color?另外,CID可以是smallint或tinyint。事实表应该尽可能地瘦,因为它通常是数百或数十亿行。 – brian 2012-08-01 17:57:40

回答

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中,编辑在颜色尺寸颜色属性为一体的DefaultMember属性:

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

的DefaultMember属性告诉MS Visual Studio中的事实标签的行具有颜色“PATRIOTIC”的乐曲已经是具有相同ID和其他颜色值的其他行的聚合。

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 
+0

谢谢你试试看。不幸的是,我正在寻找在数据立方体中定义一个度量,这个度量在两种输出情况下都能够正确计算。我不在寻找能够将数据拉出的单个SQL查询。 – 2012-08-02 12:33:41

0

不完全知道为什么你的事实表需要“ID”和“彩色”之间的交叉连接。你可以简单地消除所有的Flag = 0行,并使用ID列的简单计数作为爱国措施,不同的计数会给你爱国行的总数。

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

但是,如果将更多颜色添加到行中,您可以将“爱国”标志添加到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) 
+0

为了保持我的示例小,我只在示例中包含这些列。但也有其他专栏,载有“颜色”层面的数据。所以我不能摆脱ID 1,颜色'白'行;除爱国旗之外还有其他数据。不过谢谢你的回应。 – 2012-08-06 12:19:49