2015-11-20 141 views
0

我正在使用SSRS創建一個報告,其中層次結構顯示在x軸上。我想根據用戶通過性能點過濾器選擇的層次結構的最低級別使動態級別動態化。例如,如果用戶選擇了2015年加上2004年12月,報告應該以月份爲粒度,但顯示2014年12月 - 2015年12月(含)。返回MDX中層次結構級別的底部數量

使用了AdventureWorks立方體(2008R2),我可以查詢發貨日期財政層級結構如下:

WITH 
    MEMBER [SDName] AS [Ship Date].[Fiscal].CURRENTMEMBER.NAME 
    MEMBER [SDLevel] AS [Ship Date].[Fiscal].CURRENTMEMBER.LEVEL_NUMBER 

SELECT 
    {[SDName], [SDLevel]} ON COLUMNS 

    ,STRTOSET(" {[Ship Date].[Fiscal].[Fiscal Year].&[2011], 
       [Ship Date].[Fiscal].[Fiscal Quarter].&[2006]&[3], 
       [Ship Date].[Fiscal].[Fiscal Quarter].&[2008]&[3], 
       [Ship Date].[Fiscal].[Month].&[2007]&[5]}", CONSTRAINED) ON ROWS 

FROM [Adventure Works] 

凡STRTOSET功能將包含用戶多選擇參數的輸出。這將返回:

Basic results of query

正如你可以看到,出現了3個不同層次的選擇層次(年,季度和月份)的。我想返回月份的水平,即4

我一直在使用BOTTOMCOUNT如下嘗試:

WITH 
    MEMBER [SDName] AS [Ship Date].[Fiscal].CURRENTMEMBER.NAME 
    MEMBER [SDLevel] AS [Ship Date].[Fiscal].CURRENTMEMBER.LEVEL_NUMBER 

SELECT 
    BottomCount 
    (
     {[SDName], [SDLevel]}, 
     1, 
     [SDLevel] 
    ) ON COLUMNS 

    ,STRTOSET(" {[Ship Date].[Fiscal].[Fiscal Year].&[2011], 
       [Ship Date].[Fiscal].[Fiscal Quarter].&[2006]&[3], 
       [Ship Date].[Fiscal].[Fiscal Quarter].&[2008]&[3], 
       [Ship Date].[Fiscal].[Month].&[2007]&[5]}", CONSTRAINED) ON ROWS 

FROM [Adventure Works] 

但這正好返回相同的結果,如下圖所示以上。

我想知道這是因爲WHERE子句需要先過濾數據(思如SQL),所以我嘗試:

WITH 
    MEMBER [SDName] AS [Ship Date].[Fiscal].CURRENTMEMBER.NAME 
    MEMBER [SDLevel] AS [Ship Date].[Fiscal].CURRENTMEMBER.LEVEL_NUMBER 

SELECT 
    BottomCount 
    (
     {[SDName], [SDLevel]}, 
     1, 
     [SDLevel] 
    ) ON COLUMNS 

    ,[Ship Date].[Fiscal].ALLMEMBERS ON ROWS 

FROM [Adventure Works] 
WHERE (STRTOSET(" {[Ship Date].[Fiscal].[Fiscal Year].&[2011], 
       [Ship Date].[Fiscal].[Fiscal Quarter].&[2006]&[3], 
       [Ship Date].[Fiscal].[Fiscal Quarter].&[2008]&[3], 
       [Ship Date].[Fiscal].[Month].&[2007]&[5]}", CONSTRAINED)) 

,但我得到的錯誤:

Error message

我不明白的

我也使用子查詢的嘗試:

WITH 
    MEMBER [SDName] AS [Ship Date].[Fiscal].CURRENTMEMBER.NAME 
    MEMBER [SDLevel] AS [Ship Date].[Fiscal].CURRENTMEMBER.LEVEL_NUMBER 

SELECT 
    BottomCount 
    (
     {[SDName], [SDLevel]}, 
     1, 
     [SDLevel] 
    ) ON COLUMNS 

    ,[Ship Date].[Fiscal].ALLMEMBERS ON ROWS 

FROM (SELECT STRTOSET(" {[Ship Date].[Fiscal].[Fiscal Year].&[2011], 
       [Ship Date].[Fiscal].[Fiscal Quarter].&[2006]&[3], 
       [Ship Date].[Fiscal].[Fiscal Quarter].&[2008]&[3], 
       [Ship Date].[Fiscal].[Month].&[2007]&[5]}", CONSTRAINED) ON COLUMNS 
    FROM [Adventure Works]) 

,但是這給了我所有成員在層次結構的最低水平(儘管是已經使用STRTOSET輸入過濾的話):

All members

任何人都可以幫忙嗎?我的MDX不太好,我正在努力獲得正確的輸出。

注:我意識到,當我開始探索這個問題,我可以分析參數輸出到查找層次結構的某些層面,即

@DateSelection LIKE "*[Month]*" 

,但我希望能利用這次軍演來提高我的MDX技能!

回答

0

想通了:在查看this website時,我注意到Topcount函數正在應用於行軸,而不是上面的列。通過改變結構,使Topcount中過濾行,它返回正確的結果:

WITH 
    MEMBER [SDName] AS [Ship Date].[Fiscal].CURRENTMEMBER.NAME 
    MEMBER [SDLevel] AS [Ship Date].[Fiscal].CURRENTMEMBER.LEVEL_NUMBER 

SELECT 
    {[SDName], [SDLevel]} ON COLUMNS 

    ,Topcount(
       STRTOSET(" {[Ship Date].[Fiscal].[Fiscal Year].&[2011], 
          [Ship Date].[Fiscal].[Fiscal Quarter].&[2006]&[3], 
          [Ship Date].[Fiscal].[Fiscal Quarter].&[2008]&[3], 
          [Ship Date].[Fiscal].[Month].&[2007]&[5]}", CONSTRAINED), 
       1, 
       [SDLevel]) ON ROWS 

FROM [Adventure Works] 

注意,我不得不使用Topcount中,因爲訂單下降(我想要的層級的最低水平,即最大級別號碼)。結果是:

Correct results

。希望可以幫助別人同樣的問題。

相關問題