2015-01-08 55 views
0

我正在學習工作。我在每張牀上都有幾分鐘的桌子。我想計算病牀的利用率。我曾在2008年SSASSSAS Cube計算的成員總數錯誤

CREATE MEMBER CURRENTCUBE.[Measures].UtilisationPercent 
AS avg( 
    crossjoin(
     descendants([bedlabel].[hierarchy].currentmember, [Bedlabel].[Bedlabel]) 
    ,descendants([Date].[date].currentmember, [Date].[Day]) 
    ) 
    ,[Measures].[Utilisation Mins] 
    ) 
/(24*60), 
FORMAT_STRING = "Percent", 
NON_EMPTY_BEHAVIOR = { [Utilisation Mins] }, 
VISIBLE = 1 , ASSOCIATED_MEASURE_GROUP = 'Bedstay' ; 

,如果我按年/月或病房/牀片其實,這工作正常創建的計算成員在我的立方體。

但是多維數據集瀏覽器中顯示的總利用率是錯誤的。我如何控制利用總量的計算方式?我可以創建一個計算成員的方式,交叉連接將工作在比葉更高的級別?

January 2011 Utilisation % 
  • Bed1 98.86%
  • Bed2 88.38%
  • BED3 82.63%
  • Bed4 94.67%
  • Bed5 85.82%
  • Bed6 93.53%
  • Bed7 78.78%
  • Bed8 85.43%
  • Bed9 91.16%
  • Bed10 90.93%
  • Bed11 92.00%
  • 總計894.35%< ---這是太錯。

- MEZ的評論

確定後添加,謝謝你的提示。我嘗試了下面的範圍分配

SCOPE([Measures].[Utilisation Percentage]);  
    SCOPE([Date].[Date].MEMBERS);  
     SCOPE([bedlabel].[hierarchy].MEMBERS);  
      THIS = [Measures].[Utilisation Mins]/
        (60*24 
        * count(descendants([bedlabel].[hierarchy].currentmember, [Bedlabel].[Bedlabel])) 
        * count(descendants([Date].[date].currentmember, [Date].[Day]))) ;  
     END SCOPE;  
    END SCOPE;  
END SCOPE; 

我得到了與crossjoin方法相同的結果。在AS2008中,作用域賦值結果和舊的交叉連接方法沒有區別?它仍然總是超現實的數字,我無法解釋。

+0

看看這個鏈接(有一個例子)http://www.purplefrogsystems.com/blog/2009/11/scope-problems-with-mdx-calculated-members/。您可能需要根據日期維度使用SCOPE功能。 – Mez

+0

如果你可以在Adventure Works中重建,我會爲你找到解決方案。 –

+0

它令人尷尬,但我從未與Adventure Works合作過,現在我一眼就找不到一個相同的容量範例。 – Pho

回答

1

這是Sourav_Agasti建議的,現在可行的排列組合。我認爲avg +非空交叉連接的效果比avg + coalesceempty好。

CREATE MEMBER CURRENTCUBE.[Measures].UtilisationPercent 
AS avg(nonemptycrossjoin(
     descendants([bedlabel].[hierarchy].currentmember,[bedlabel].[hierarchy].[Bedlabel]) 
     ,descendants([Date].[date].currentmember,[date].[date].[day])) 
     , [Measures].[Utilisation Mins]/ (24*60)), 
FORMAT_STRING = "Percent", 
NON_EMPTY_BEHAVIOR = { [Utilisation Mins] }, 
VISIBLE = 1 , ASSOCIATED_MEASURE_GROUP = 'Bedstay'; 

根據MEZ的建議,這也起作用。

SCOPE([Measures].[Utilisation Percentage]); 
    scope ([bedlabel].[hierarchy].members); 
     scope ([date].[date].members);  
      this = avg(nonemptycrossjoin(
      descendants([bedlabel].[hierarchy].currentmember,[bedlabel].[hierarchy].[Bedlabel]) 
      ,descendants([Date].[date].currentmember,[date].[date].[day])) 
      , [Measures].[Utilisation Mins]/ (24*60)) ; 
      non_empty_behavior (this) = [Utilisation Mins] ; 
     end scope; 
    end scope; 
END SCOPE; 

與AS2000的區別是我只需要這樣做,再加上指定平均值作爲計算度量上的聚合方法。我也沒有多層次。語法對我來說似乎簡單得多。

avg(nonemptycrossjoin(descendants([Unit].currentmember,[Unit].[Bed label]),descendants([Date].currentmember,[date].[day])), [Measures].[Utilisation Min]/ (24*60)) * 100' 

謝謝所有試圖幫助的人!

+0

很高興你有一個解決方案。同樣flummoxed爲什麼這個工作和'CoalesceEmpty'沒有。希望有人能解釋。 – SouravA

+0

我也不明白爲什麼一個人工作,另一個沒有。最好的我可以在網上找到這個鏈接http://technet.microsoft.com/en-us/library/aa224802(v=sql.80).aspx但是,我不明白後更好地閱讀它。 – Pho

0

這可能是因爲空元組產生問題。使用CoalesceEmpty功能將取代空單元格用0嘗試下面的代碼:

CREATE MEMBER CURRENTCUBE.[Measures].UtilisationPercent 
AS avg(crossjoin(descendants([bedlabel].[hierarchy].currentmember, [Bedlabel].[Bedlabel]), 
descendants([Date].[date].currentmember, [Date].[Day])), CoalesceEmpty([Measures].[Utilisation Mins], 0)) 
/(24*60), 
FORMAT_STRING = "Percent", 
NON_EMPTY_BEHAVIOR = { [Utilisation Mins] }, 
VISIBLE = 1 , ASSOCIATED_MEASURE_GROUP = 'Bedstay' ; 

由於AVG似乎並不奏效,請檢查下面的腳本了太多:

CREATE MEMBER CURRENTCUBE.[Measures].a 
as 
SUM(
(descendants([bedlabel].[hierarchy].currentmember, [Bedlabel].[Bedlabel]) * descendants([Date].[date].currentmember, [Date].[Day])), 
[Measures].[Utilisation Mins]), 
NON_EMPTY_BEHAVIOR = { [Utilisation Mins] }, 
VISIBLE = 1 , ASSOCIATED_MEASURE_GROUP = 'Bedstay' ; 

CREATE MEMBER CURRENTCUBE.[Measures].b 
as 
COUNT(
(descendants([bedlabel].[hierarchy].currentmember, [Bedlabel].[Bedlabel]) * descendants([Date].[date].currentmember, [Date].[Day])) 
,EXCLUDEEMPTY 
), 
NON_EMPTY_BEHAVIOR = { [Utilisation Mins] }, 
VISIBLE = 1 , ASSOCIATED_MEASURE_GROUP = 'Bedstay' ; 

CREATE MEMBER CURRENTCUBE.[Measures].C 
AS 
[Measures].A/[Measures].B, 
FORMAT_STRING = "Percent", 
NON_EMPTY_BEHAVIOR = { [Utilisation Mins] }, 
VISIBLE = 1 , ASSOCIATED_MEASURE_GROUP = 'Bedstay' ; 
+0

結果再一次看起來在牀位/ 2011年1月的粒度,但所有牀位的總數都經歷了屋頂,這次變化爲1394.35%。它似乎沒有工作。我無法爲自己辯解總數。 – Pho

+0

你可以嘗試擺脫'Non_Empty_Behavior'並檢查? – SouravA

+0

請參閱我的編輯。 – SouravA

0

不是一個回答,但也許是一種方式來挖掘發生的事情。

請嘗試添加以下措施:

CREATE MEMBER CURRENTCUBE.[Measures].UtilisationCount 
AS Count( 
    crossjoin(
     descendants([bedlabel].[hierarchy].currentmember, [Bedlabel].[Bedlabel]) 
    ,descendants([Date].[date].currentmember, [Date].[Day]) 
    ) 

然後在查詢中添加此新措施,在列上,希望X,Y,Z,J,Q將是一些數字 - 什麼爲q?:

January 2011 UtilisationCount Utilisation % 

Bed1   x     98.86% 
Bed2   y     88.38% 
Bed3   z     82.63% 
Bed4   j     94.67% 
Total   q     894.35% 
+0

添加了該措施。 q = 31,因爲Jan有31天。 q沒有發現我的期望。我仍然感到困惑。不知何故,MDX在AS2000中感覺更加輕鬆:我不記得那時正在用這個總利用率掙扎。 – Pho

+0

@Pho mdx在最新的實施中效率更高。語法沒有太大改變。 – whytheq