复杂或有趣的MDX问题求解(3)-SQL查询事实表与MDX语句查询的关系示例

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]))

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值