2013-12-16 30 views
5

我正在使用icCube的銷售多維數據集來學習MDX。我想寫一個MDX查詢,以顯示2010年銷售收入超過80,000美元的那些國家2009年的銷售收入。我嘗試以下,但是它返回一個空表只有一列([金額]):MDX:在同一維度的不同成員上篩選和切片

WITH 
SET [myset] AS Filter([Country].members, ([Measures].[Amount], [2010])>80000) 
select [Country].members on 0, [Amount] on 1 
from (select [myset] on 0, [Amount] on 1 from [sales]) 
where [2009] 

回答

2

只需使用

WITH 
SET [myset] AS Filter([Country].members, ([Measures].[Amount], [2010])>80000) 
select [myset] on 0, [Amount] on 1 
from [sales] 
where [2009] 

在MDX,這種類型的查詢並不需要一個子查詢或WHERE。你甚至可以省略集myset,寫

select Filter([Country].members, ([Measures].[Amount], [2010])>80000) on 0, 
     [Amount] on 1 
from [sales] 
where [2009] 

我嘗試過類似的查詢上冒險的作品,它顯示了所有的客戶,澳大利亞,加拿大和美國,而不是法國,德國和英國:

SELECT Filter([Customer].[Country].Members, 
       ([Measures].[Internet Sales Amount], [Date].[Calendar Year].&[2006]) > 600000 
      ) 
     ON 0, 
     {[Measures].[Internet Sales Amount]} 
     ON 1 
FROM [Adventure Works] 
WHERE [Date].[Calendar Year].&[2008] 
+0

這不起作用。它返回一個空表。據我所知,在[2009]上切片將擺脫[2010]的所有數據... – AlwaysLearning

+0

@MeirGoldenberg我驗證了我的查詢 - 根據需要進行了改編 - 使用MS Adventure Works,查看我的編輯答案。我假設你的查詢或你的數據有其他問題。 – FrankPl

+0

icCube中存在一個bug :-(這就是爲什麼不工作 – ic3

1

更新:元組評估是我們錯過的一個案例,該錯誤已在icCube 4.2中修復。請注意,在where子句和軸上使用相同的層次結構會非常棘手。任何集合都會被過濾掉:「{[2010],[2011]} on 0 .. [2010]將返回[2010],但是一個元組在沒有過濾的情況下被評估,同一維度的不同層次結構將應用自動存在過濾器

由於這是一個有點棘手,我們決定延長SETS允許申報在與全球範圍內評估查詢一組 - 不考慮where子句和子查詢:

WITH 
-- always the same regardless of the where clause and subquery 
    STATIC SET [Global] Filter([Country].members, ([Measures].[Amount], [2010])>80000) 
.. 

最簡單和最有效的解決方案是按照弗蘭克的建議,直接在軸上添加過濾的國家。

SELECT 
    // this will return the countries with sales amount bigger than 80'000 for [2010] 
    // e.g. { [USA], [UK] } ... [2010] is is just used for filterting 
    Filter([Country].members, ([Measures].[Amount], [2010])>80000) on 0, 
    // When evaluated we're going to use [2009] as it's the slicer default value 
    [Amount] on 1 
FROM [sales] 
WHERE [2009] 

關於您的查詢它應該工作,我同意,這是在icCube(PTS)中的錯誤,我們將盡快修復。在此期間,你必須避免使用同一層次的切片機,並在切片機中使用的過濾器功能,是這樣的:

WITH 
MEMBER [Amount 2009] AS ([Amount],[2009]) 
SELECT 
    Filter([Country].members, ([Measures].[Amount], [2010])>80000) on 0, 
    [Amount 2009] on 1 
FROM [sales] 

或者你也可以更改爲在icCube(比弗蘭克的工作效率較低版本一個):

SELECT [Country].members on 0, [Amount] on 1 
FROM (select Filter([Country].members, ([Measures].[Amount], [2010])>80000) on 0 from [sales]) 
WHERE [2009] 

如果您與分組根據不同critierias你可以使用一個新的功能發揮icCube推出前幾個月的:Categories

它允許創建一個層次中的其他成員hierar chies。您可以將這些國家定義爲[80000+],然後根據此新分類進行計算。

+0

請指出我出錯的地方,但在我看來,沒有子查詢的解決方案顯然是錯誤的,因爲評估的順序查詢是:FROM,WHERE,SELECT(集合等)。一旦WHERE子句中的切片完成(並且只有[2009]的數據保留在多維數據集中),我無法在SELECT子句中的[2010]上使用過濾器。請參閱以下文章:http://social.msdn.microsoft.com/Forums/sqlserver/en-US/cd980958-e443-444e-a176-9285d5080059/mdx-query-execution-and-context?forum=sqlanalysisservices – AlwaysLearning

+0

MDX中的WHERE子句不像SQL,更像是設置默認值的方式。因此,如果在[2010]的軸中,您將使用[2010]覆蓋[2009]。這是當你使用一個子查詢時,你得到了像SQL WHERE子句中那樣的行爲。這很奇怪,但它是MDX的工作原理 – ic3

+0

直到我們在幾天內發佈一個新版本,你必須使用靜態集合或查詢與子選擇(我的文章的第二個) – ic3

相關問題