ssas - Mdx Sum 返回非整数值

标签 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 使用银行家四舍五入,因此应四舍五入为 0.60。

仅使用 Round(0,595) 即可给出正确的结果。

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

此外,如果我用 StrToValue() 函数包装 Sum(),即使我在集合中使用超过 5 个 SomeNumber,它也能工作

这是怎么回事?!

最佳答案

不确定是否是您正在寻找的实际答案。您遇到的问题与数值精度(又称舍入误差)有关,而不是 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),但不太聪明(10 是一个例子)。

如果您有兴趣,请从维基百科 here 开始

关于ssas - Mdx Sum 返回非整数值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9196512/

相关文章:

sql - 立方体中的非聚合度量

c# - SSAS:以编程方式永久创建计算成员

java - ActivePivot 实时推送分析维度

security - 客户端 OLAP(例如客户端 MDX 构造加上 xmla4js)是否不利于安全?

sql-server - 如何通过 ADOMD.NET 使用 DMX 查询

c# - 如何以编程方式检查 SSAS 数据库/多维数据集是否正在处理?

sql-server-2008 - 重建时 SSAS 多维数据集的可用性

java - 我们应该使用哪些 Web 服务将 MDX 查询发送到 ActivePivot?

ssas - MDX WHERE 与 FILTER 选项

ssas - IT 支持业务的 OLAP 多维数据集设计引用