2015-10-23 61 views
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 

回答

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)的差異可能是由於浮動點不準確(見moremore)。如果我們增加數以百萬計的雙打,情況可能如此。

爲什麼它不同?

當我們使用總和時,我們將爲該成員的每個成員添加評估值。 SumForEachMember(SumRowMember())

使用類別時,我們將該集合轉換爲新的僞成員。我們將爲每個匹配的行求和。 SumRowPseudoMember()。

如果我們使用浮點型aritmetic,兩者都不會返回相同的值。第一個應該更準確。

+0

我試過你的建議,但我仍然看到不同的值。使用不同的多維數據集設置進行測試後,我意識到當存儲策略設置爲「內存」時結果是相同的,但是當我將存儲策略設置爲「索引和文件中的事實」時,問題再次出現。 「緩存表」設置對結果沒有影響。該多維數據集在CentOS Linux上運行。 –

+0

變得越來越複雜,您可以通過電子郵件與我們聯繫... – ic3

+0

如果行數不是很大,您還可以嘗試使用鑽取技術http://www.iccube.com/support/documentation/mdx/Drillthrough.php – ic3