使用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
答案 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)差异可能是由于浮点不准确(参见more和more)。如果我们增加数百万的双打,情况就是这样。
为什么会有所不同?
当我们使用总和时,我们为该成员的每个成员添加该成员的评估值。 SumForEachMember(SumRowMember())
使用类别时,我们将集合转换为新的伪成员。我们将为每个匹配的行求和值。 SumRowPseudoMember()。
如果我们使用浮点算法,两者都不会返回相同的值。第一个应该更准确。