代码改变世界

维度用法设置不当导致的数据无法正确聚合的问题及解决

2008-12-10 22:31  Yin.P  阅读(2135)  评论(9编辑  收藏  举报

    这几天在学习过程中出现了一个数据无法正确聚合的问题。花了很多时间去分析MDX代码都没有发现什么问题,最后在网上询问后才发现问题出在数据立方那里,问题在于MDX查询中涉及到的度量值和维度之间没有关联。设置了它们之间的关联后,就可以正常聚合数据了。 

MDX Query 1

 

    上面是有问题的代码,其中涉及到维度[Warehouse]和度量值[Unit Sales],目的是要计算每个Warehouse在总体中所占的份额百分比。在设置维度与度量值之间的关联时这个查询得到的结果如图一:

图一,数据没有正确聚合时的情况

 

而对于下面的代码: 这段代码的目的与前一段代码的目的是一样的,只是用到的维度不同,在这里用到的是[Product]维度。而这个MDX查询得到的结果如图二:

MDX Query 2

 

 

图二:数据正确聚合时的情况

 

其原因可见图三:

图三:MDX查询所对应的数据立方的维度用法情况

 

    由图三中的矩阵可见[Warehouse]维度与[Sales]度量值组之间是没有关联的,所以无法通过[Warehouse]维度来聚合数据,而[Product]维度和[Sales]度量值组之间有常规的关联,所以第二段代码可以正确地计算。由此可以看出,维度用法设置会影响查询的正确性。维度用法中有常规、多对多、引用、数据挖掘等这些类型的关联。其中常规类型是指最普通的维度与事实表之间的关联,即事实表中的外键属性引用维度表中的主键属性;多对多是指维度表与一个中间事实表关联,而这个中间事实表又与一个中间维度表关联,这个中间维度表直接与目标事实表关联,也就是说在分析所需要的维度表和事实表之间又隔了一个事实表和维度表(不知道这里可不可以推广一下,即在中间事实表和目标事实表之间不止一个中间维度表,而是多个关联引用的维度表,我想应该是可以的,因为这些维度表之间如果有引用的话就可以通过一个表获知另一个维度表的数据,这样一层层的推下去其效果应该和只有一个中间维度表相同,有待证实);引用类型就是指在维度表和事实表之间间隔有一个维度表,这个维度表与分析要使用的那个维度表之间有引用关系(和多对多类型一样,这里我想也可以推广)。

    对于本文所提到的问题,经分析其数据源视图后发现[Warehouse]维度与[Sales]度量值组之间有多对多的关联,因此做对应的修改之后,问题解决。结果如下图。

图四:修改维度用法之后的结果