SQL SUM事实表成员列和MDX成员查询之间的关系如何呢?根据维度层次的定义关系,及成员在层次中的位置,情况有很多种。CSDN的boa_bi提了一个问题,是SQL、MDX关系的简单的一种。
如果简单的这样写
with member [Measures].[a] as '([Measures].[Store Sales]+[Measures].[Store Cost])*[Measures].[Sales Count]'
select
{[Measures].[a]} on columns,
{[Store].[All Stores].[USA]} on rows
from sales
我的理解:显示出来的数字应该是所有USA地区数据做([Measures].[Store Sales]+[Measures].[Store Cost])*[Measures].[Sales Count]运算之后再做和
运行之后发现这个与在management studio中执行如下的SQL语句的结果不一样
select sum((
[Store Sales]+[Store Cost])*[Sales Count])
from sales where region=1;
不知道哪里出了问题?
1、假设采用SASS 2000及附带Foodmart2000示例解释问题;
2、假设USA所在的维度,即店面的地区维是规则的维度(如果是各分支层次不一的维度,则更复杂);
在给定的示例中,两者的结果一般情况下应该是不一样的,除非USA下面只有一个成员或USA是叶子成员,或事实数据的数值比较特殊造成恰好相同,至于这个特殊条件是什么,则需要解析方程求的,这里没能力再深究了。
两者结果不同的原因,通过示例解释如下:
假设:
dw中关于USA,只有以下几行事实数据,需要求解result=(b+c)*a。
则:
1)事实数据的形式及数值进一步假设如下:
国家 省份 a b c
1 1 1 10 100
1 2 2 20 200
1 3 3 30 300
2) MDX计算
2.1) mdx运算时,首先是执行聚合运算,在地区上聚合出USA,结果可以看作如下内容:
国家 省份 a b c
1 all 6 60 600
2.2) 然后再执行公式指定的运算,最终得到的结果为3960 :
result=(60+600)*6=3960
3) SQL计算
3.1) Sql运算时,首先遍历每一行,并对当前行计算指定的公式,如下:
r1=(10+100)*1=110
r2=(20+200)*2=440
r3=(30+300)*3= 990
3.2)然后再对刚才遍历各行的计算结果执行sum聚合,则得到最终结果为1540:
result=r1+r2+r3=110+440+990=1540
4)结论
boa_bi的问题中,MDX与SQL计算结果的不一致是由各自的计算优先顺序导致的,其实也类似于我们在编程中常遇到的其他Sum(calc(expresion)) <>calc(sum(expressionItems)) 的问题。
那么如何撰写语句,使两者相同呢?
在上例中,如果将第一个MDX需要重新写过,你试一下这样是否可以,将问题描述中MDX语句的[Store].[All Stores].[USA]做以下改动,可能是可以产生相同结果的:
1)对USA先求叶子,也就是最末的一个级别上的Descendants;
2)再对对上一步求Aggregate;
即,原语句中的[Store].[All Stores].[USA]用如下内容替换即可(需自己调试):
Aggregate(Descendants([Store].[All Stores].[USA],[Store].[Store Name]))