2012-07-18 380 views
1

我試圖手藝MDX查詢來回答以下形式的問題:MDX查詢層次包含/排除

顯示我的所有記錄在2008年,除了那些在十一月,除非它們發生在11月17日。

該查詢必須概括爲使用多於三個子句並且不應該是日期特定的。 (我問使用日期作爲例子,因爲它很容易理解 - 我很感興趣,我概括爲MDX不同層級

這是迄今爲止我已經得到最接近:

SELECT 
NON EMPTY {  [Measures].[Session Count] } ON COLUMNS, 
NON EMPTY {  ([SessionIDs].[Session ID].Children) } ON ROWS 
FROM (
     SELECT 
      Union(
        Descendants([Start Date].[Date].Year.[2008], , LEAVES), 
        Descendants([Start Date].[Date].[Date].&[20081117], , LEAVES) 
      ) 
      - 
      Descendants([Start Date].[Date].[Month].&[2008]&[11], , LEAVES) 
      ON COLUMNS 
     FROM [ADM] 
) ; 

問題是,第二次包含(2008年11月17日)被排除在外,我試着在第一次聯合中保留重複項,但是Exclude(減去運算符)消除了所有匹配成員的副本

編輯:

這是另一個例子來幫助理解當我要求「可普遍化」解決方案時的意思。

考慮一個映射應用程序,其中用戶可以選擇查看他們選擇的地理區域中的數據。他們通過放大和縮小地圖來選擇這些區域,並選擇/取消選擇quadkeys。 Quadkeys整齊地映射到通常介於18到23層之間的層次結構。

一個有效的用例將隨後是:

  • 選擇QK0
  • 取消QK002
  • 選擇QK0021230
  • 取消QK002123033201和QK002123033202

在字(和完全製造映射到這些quadkeys的地名),這將會是這樣的:向我顯示North A的所有數據美國,但不包括美國的數據,除非該數據是針對紐約州的,但不包括奧爾巴尼或格倫斯福爾斯。

因此,上述日期的相同查詢結構必須適用於映射或任何其他層次結構集。還值得注意的是,我正在構建這個MDX以響應用戶的操作。

回答

3

subselect你只需要把這個列:

{Except([Start Date].[Date].Month.Members, {[Start Date].[Date].[Month].&[2008]&[11]}), [Start Date].[Date].[Date].&[20081117]} 

我假定你有一個月的水平。表達式的第一部分將返回所有monthes,但2008年11月,然後添加2008年11月17日。

編輯:

對於你的第二個例子中,你可以寫這樣的事情:

Except(all the cities in north america, 
     Except(all the cities in USA, 
       Except(all the cities in New York state, 
         {Albany , Glens Falls}))) 

您可以檢索在北美的城市,在美國和在紐約州與Descendants功能和LEAVES標誌。

+0

這似乎並不具有普遍性雖然。對於給定的例子它可以正常工作。我會在問題中發表另一個例子。 – 2012-07-19 12:54:00

+0

爲了您的編輯,這正是我所到達的。謝謝。 – 2012-07-19 17:17:51

0

不知道要明白你的「的不僅僅是三個子句......任何層次的工作」,但這裏的意思是設定你的要求:

select 

    Hierarchize (
    Union(
     Except(  
     Descendants([Start Date].[Date].[Year].[2008]  , [Start Date].[Date].[Month], SELF), 
     Descendants([Start Date].[Date].[Month].&[2008]&[11], [Start Date].[Date].[Month], SELF)  
    ), 
     [Start Date].[Date].[Date].&[20081117] 
    ) 
) 

    on 0 from [ADM] 
+0

我的意思是我想要一個可以處理任何層次結構和任意數量的包含/排除的通用解決方案。 取而代之的是Date示例,請考慮一個映射應用程序,該應用程序通過四鍵來分割數據。用戶查詢可以是:向我展示QK0中的所有內容,除了QK0012中的內容外,除非它在QK001200中,而不在QK001200132中。 (等等一個典型的quadkey分層結構是20層深)。 你有什麼和我昨晚自己想的非常相似。我仍在研究它是否像所需的那樣靈活。 – 2012-07-19 12:52:21

+0

我在原始問題中添加了一個大的編輯來充實這個想法。 – 2012-07-19 13:04:57