Mdx Sum返回非整数值

时间:2012-02-08 15:40:43

标签: ssas mdx olap

当工作中出现问题时,使用与Round()函数一起返回的值时,SUM()函数返回的值不会被视为“正常”数字。

试试这个MDX例如

WITH 
MEMBER SomeNumber AS 0.595 
SET SomeNumberSet AS 
           {[SomeNumber], [SomeNumber], [SomeNumber], [SomeNumber], [SomeNumber], [SomeNumber], [SomeNumber], [SomeNumber] }

MEMBER SomeNumberSum AS
Round(SUM([SomeNumberSet], [Measures].[SomeNumber]) / 8, 2)


SELECT [SomeNumberSum] ON 0

FROM [SomeCube]

此代码返回0.59,集合总和为4,76,然后除以8 = 0,595。由于MDX使用Bankers四舍五入,因此应该舍入为0.60。

只需使用Round(0,595)就可以得到正确的结果。

更奇怪的是,如果我们在集合中仅使用SomeNumber 6次或更少,并且使用相同乘数的Round Function除以得到0.6(这是正确的)

另外,如果我使用StrToValue()函数包装Sum(),它就可以工作,即使我在集合中使用了超过5个SomeNumbers

怎么回事?!

2 个答案:

答案 0 :(得分:3)

不确定您正在寻找的实际答案。这个问题与数值精度有关,也就是舍入误差,而不是MDX。

如果您使用的是Java,请运行以下测试:

public void testNumeric()
{
    double sum = 0.0;
    double value = 0.595;

    for (int i = 0; i < 8; i++)
    {
        sum += value;
    }

    double prod = value * 8;
    assertEquals(sum / 8, prod / 8);
}

断言会失败,奇怪的不是吗?

Result : expected:<0.5949999999999999> but was:<0.595>

第一个,sum,是mdx如何计算该值。你有一点点差异,但它足以改变ROUND()的结果。

有解决方案吗?

严格说不,由于计算机数值计算的本质,这是一个错误。实际上你可以先把它作弊一点到10 - ROUND(ROUND(MyNumber,10),2),而不是brillant(10就是一个例子)。

如果您有兴趣从here

开始维基百科

答案 1 :(得分:-1)

根据Chris Webb的说法,这种行为是故意的:

http://www.techonthenet.com/access/functions/numeric/round.php

如果您有Excel库,则可以:

WITH 
MEMBER SomeNumber AS 0.595 
SET SomeNumberSet AS 
           {[SomeNumber], [SomeNumber], [SomeNumber], [SomeNumber], [SomeNumber], [SomeNumber], [SomeNumber], [SomeNumber] }

MEMBER SomeNumberSum AS
Excel!Round(SUM([SomeNumberSet], [Measures].[SomeNumber]) / 8, 2)

SELECT [SomeNumberSum] ON 0
FROM [Adventure Works]