2

使用 icCube 5.1.2,动态集和成员的定义方式与高级/脚本部分中的静态集相同。在 MDX IDE 中计算的结果是不同的。这怎么可能?

-- Advanced / Scripts
-- CREATE STATIC SET [SET MTD]   as Mtd( ClosingPeriod([temps].[temps].[jour]) )
-- CREATE STATIC SET [SET MTDLY] as Mtd( ParallelPeriod( [temps].[temps].[annee], 1, ClosingPeriod([temps].[temps].[jour]) ) )
-- CREATE CATEGORY MEMBER [Util].[Categories].[default].[MTD]   as [SET MTD]
-- CREATE CATEGORY MEMBER [Util].[Categories].[default].[MTDLY] as [SET MTDLY]

with
-- from static sets
member [Measures].[CM (STATIC SET)]    as Sum( [Util].[Categories].[default].[MTD], [Measures].[ventes] ) * 0.001, format_string="#.#"
member [Measures].[CM LY (STATIC SET)] as Sum( [Util].[Categories].[default].[MTDLY], [Measures].[ventes] ) * 0.001, format_string="#.#"

-- dynamic members
member [Measures].[CM (DYNAMIC MEMBER)]    as Sum( Mtd( ClosingPeriod([temps].[temps].[jour]) ), [Measures].[ventes] ) * 0.001, format_string="#.#"
member [Measures].[CM LY (DYNAMIC MEMBER)] as Sum( Mtd( ParallelPeriod( [temps].[temps].[annee], 1, ClosingPeriod([temps].[temps].[jour]) ) ), [Measures].[ventes] ) * 0.001, format_string="#.#"

-- dynamic sets
set [SET MTD 2]   as Mtd( ClosingPeriod([temps].[temps].[jour]) )
set [SET MTDLY 2] as Mtd( ParallelPeriod( [temps].[temps].[annee], 1, ClosingPeriod([temps].[temps].[jour]) ) )
member [Measures].[CM (DYNAMIC SET)]    as Sum( [SET MTD 2], [Measures].[ventes] ) * 0.001, format_string="#.#"
member [Measures].[CM LY (DYNAMIC SET)] as Sum( [SET MTDLY 2], [Measures].[ventes] ) * 0.001, format_string="#.#"
select
{
[Measures].[CM (DYNAMIC MEMBER)],
[Measures].[CM (DYNAMIC SET)],
[Measures].[CM (STATIC SET)],
[Measures].[CM LY (DYNAMIC MEMBER)],
[Measures].[CM LY (DYNAMIC SET)],
[Measures].[CM LY (STATIC SET)]
}
on columns
from [Ventes]

Results:
-- current month this year
CM (DYNAMIC MEMBER): 42698.7
CM (DYNAMIC SET):    42698.7
CM (STATIC SET):     42697.1

-- current month last year
CM LY (DYNAMIC MEMBER): 44243.4
CM LY (DYNAMIC SET):    44243.4
CM LY (STATIC SET):     44242.1
4

1 回答 1

1

奇怪的是静态和动态集之间的区别是 where 子句和在这种情况下我们没有的切片器。

我们应该通过支持来处理这个问题(随时发送电子邮件)。同时,让我们看看 3 个可能的问题根源:

1)问题可能出在集合定义上,你能检查一下是否相同(应该是这样)?

member [C1] as count( [SET MTD] - [SET MTD 2] )
member [C2] as count( [SET MTDLY] - [SET MTDLY 2] )

如果不为零,请使用SetToStr函数检查有什么不同?

2) 另一种可能性是 [temps] 维度定义了多对多关系。在计算 [CM (STATIC SET)] 时,我们使用的类别不计入同一行的两倍。

这个

member [Measures].[CM (STATIC SET)]    as Sum( [Util].[Categories].[default].[MTD], [Measures].[ventes] ) * 0.001, format_string="#.#"

是相同的

member [Measures].[CM (STATIC SET)]    as ( [Util].[Categories].[default].[MTD], [Measures].[ventes] ) * 0.001, format_string="#.#"

因为 [MTD] 是一个可以被视为成员的类别。我们可以通过使用底层集合来检查这一点:

member [Measures].[CM (STATIC SET) II]    as Sum( [SET MTD] , [Measures].[ventes] ) * 0.001, format_string="#.#"

并与使用该类别的版本进行比较。

如果集合和类别给出不同的值,则可能是由于多对多关系或大量行的数字问题:

3)差异可能是由于浮点数不准确(见越来越)。如果我们添加数百万个双打,情况可能就是这样。

为什么不一样?

当我们使用总和时,我们为集合的每个成员添加该成员的评估值。SumForEachMember(SumRowMember())

使用类别时,我们将集合转换为新的伪成员。我们将对每个匹配行的值求和。SumRowPseudoMember()。

如果我们使用浮点算法,两者都不会返回相同的值。第一个应该更准确。

于 2015-10-24T08:48:18.227 回答