静态和动态集的不同结果

时间:2015-10-23 20:33:10

标签: iccube

使用icCube 5.1.2,动态集和成员的定义方式与高级/ scripts部分中静态集的定义方式相同。在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

1 个答案:

答案 0 :(得分: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(静态设置)]时,我们使用的计数类别不计算同一行的两倍。

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)差异可能是由于浮点不准确(参见moremore)。如果我们增加数百万的双打,情况就是这样。

为什么会有所不同?

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

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

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