2016-09-12 73 views
0

我有一個MDX查詢:MDX過濾通過更精細的數值

SELECT 
    ({[Measures].[Sales Count]}) ON COLUMNS, 
    {Filter([Creation Date].[Day].Members, 
    ([Creation Date].[Day].CurrentMember.Name >= '2016/09/01' AND 
    [Creation Date].[Day].CurrentMember.Name <= '2016/09/05'))} ON ROWS 
      FROM [Date Sales Schema] 

它讓我選擇日期範圍內的銷售數量。 此外,我可以通過將查詢中的[創建日期] [[日期]替換爲[創建日期] [分鐘]來按分鐘過濾。 但如果我想過濾分鐘,並得到結果與銷售計數,我不知道,我必須寫什麼查詢?

例如: 過濾從9月8日 - 15:57至9月10日 - 13:35 - 其結果應該是:

  • 銷售的9月8日15:57的數量 - 23 :59
  • 銷售9月9日的24小時
  • 銷售10日的數月數00:00 - 13:35

這樣的查詢是決定近:

SELECT 
    {[Measures].[Sales Count]} ON COLUMNS 
,Exists 
    (
    [Creation Date].[Day].MEMBERS 
    ,Filter 
    (
     [Creation Date].[Minute].MEMBERS 
    , 
     [Creation Date].[Minute].CurrentMember.Name >= '2016/09/01 15:57' 
     AND 
     [Creation Date].[Minute].CurrentMember.Name <= '2016/09/10 15:57' 
    ) 
) ON ROWS 
FROM [Date Sales Schema]; 

但是,例如,如果我如果銷售是在2016年2月10日23:55發,並且過濾器開始於2016年2月10日23:54,結果要求向我顯示10.02的所有銷售額。

下一個查詢計算所有時期的總和,並打印總和作爲衡量每天維:

WITH MEMBER [Measures].[Day Period Sales Count] AS Aggregate(Filter 
    (
     [Creation Date].[Minute].MEMBERS 
    , 
     [Creation Date].[Minute].CurrentMember.Name >= '2016/09/01 07:27' 
     AND 
     [Creation Date].[Minute].CurrentMember.Name <= '2016/09/01 15:57' 
    ) 
) 
SELECT 
([Measures].[Day Period Sales Count]) ON COLUMNS ,{[Creation Date].[Day].[2016/09/01],[Creation Date].[Day].[2016/09/02]} ON ROWS 
FROM [Date Sales Schema] 

但不按天數劃分結果

回答

2

你可以把記錄過濾器在子選擇:

SELECT 
    {[Measures].[Sales Count]} ON COLUMNS 
,{ 
    Filter 
    (
     [Creation Date].[Day].MEMBERS 
    , 
     [Creation Date].[Day].CurrentMember.Name >= '2016/09/01' 
     AND 
     [Creation Date].[Day].CurrentMember.Name <= '2016/09/05' 
    ) 
    } ON ROWS 
FROM 
(
    SELECT 
    [Creation Date].[Minute].&[1] : [Creation Date].[Minute].&[10] ON 0 
    FROM [Date Sales Schema] 
); 

沒有一個subselect

SELECT 
    {[Measures].[Sales Count]} ON COLUMNS 
,Exists 
    (
    [Creation Date].[Day].MEMBERS 
    ,Filter 
    (
     [Creation Date].[Minute].MEMBERS 
    , 
     [Creation Date].[Minute].CurrentMember.Name >= '2016/09/01 15:57' 
     AND 
     [Creation Date].[Minute].CurrentMember.Name <= '2016/09/10 15:57' 
    ) 
) ON ROWS 
FROM [Date Sales Schema]; 

試試這個:

WITH 
    MEMBER [Measures].[Day Period Sales Count] AS 
    Aggregate 
    (
     (EXISTING 
     Filter 
     (
      [Creation Date].[Minute].MEMBERS 
     , 
      [Creation Date].[Minute].CurrentMember.Name >= '2016/09/01 07:27' 
      AND 
      [Creation Date].[Minute].CurrentMember.Name <= '2016/09/01 15:57' 
     )) 
    ,[Measures].[Sales Count] 
    ) 
SELECT 
    [Measures].[Day Period Sales Count] ON COLUMNS 
,{ 
    [Creation Date].[Day].[2016/09/01] 
    ,[Creation Date].[Day].[2016/09/02] 
    } ON ROWS 
FROM [Date Sales Schema]; 
+0

嗯,在您第一次嘗試查詢後,我收到一個錯誤:第14行第1列令牌'(' – MagentaMill

+0

)的語法錯誤如果我想按分鐘過濾,我可能不需要行:Filter ( [日期] .CurrentMember.Name> ='2016/09/01' AND [創建日期]。[日期] .CurrentMember.Name [日期] .MEMBERS , [創建日期] <='2016/09/05' ) – MagentaMill

+0

@MagentaMill我以爲你想過濾日期和分鐘? – whytheq

0

這將有助於瞭解您的日期/時間維度/秒/內置。

分鐘/小時是日期屬性嗎?有沒有關聯這兩者的任何層次結構?

你可以得到你的日期爲RANGE。甚至應該有助於提高性能。

[時間]部分... SSAS不準備處理分鐘和小時以及日期,除非您實際上將兩者都關聯到一個層次結構中,這應該使它與Range保持非常直的關係以獲取所有值。只需在您的子選擇中使用Range即可,正如whyth指出的那樣,並在您的軸上使用[Creation Date].[Day]

{[Creation Date].[Full DateTime Hierarchy].&[20160801].&[1557]:[Creation Date].[Full DateTime Hierarchy].&[20160901].&[2359]} 

但是,這將取決於你的維度。

+0

我使用mondrian java-library,顯然它不支持子查詢.. – MagentaMill

+0

相當大的結構要失蹤 - 我可以從2012/13看到http://jira.pentaho.com/browse/MONDRIAN-980- – whytheq