2017-02-14 24 views
0

私は、2つの日付の間の各月の15日目のメジャー値を返すMDXクエリを作成したいと考えています。複数の並列期間を設定するにはどうすればよいですか?

例えば、2010-01-01および2016年12月15日のための結果は以下のようにすべきである:

2016-12-15: 123 
2016-11-15: 789 
2016-10-15: 556 
(...) 
2010-01-15: 456 

私は(私はDateDiff関数を使用して2つの日付の間の月数を計算することができる知っている)関数。また、ParallelPeriod()関数を使用して前月の値を取得できます。

しかし、これらの値を一緒に使用して1からDateDiff()の結果を「反復」して、「Days」セットに複数のParallelPeriod()呼び出しを作成することはできません。

WITH 
MEMBER NumberOfMonths AS 
DateDiff("m", 
    [Calendar].[Day].&[20100101].MemberValue, 
    [Calendar].[Day].&[20160315].MemberValue 
) 

SET Days AS { 
    PARALLELPERIOD([Calendar].[Month], 1, [Calendar].[Day].&[20160315]), 
    PARALLELPERIOD([Calendar].[Month], 2, [Calendar].[Day].&[20160315]), 
    PARALLELPERIOD([Calendar].[Month], 3, [Calendar].[Day].&[20160315]) 
    -- (...) How to generate this set automatically, using NumberOfMonths? 
} 

SELECT 
    { Days } ON 0, 
    { Quantity } ON 1 
FROM [MyCube] 

助けてください。

+3

あなたはキューブの開発者ですか?もしそうなら、最良のアプローチは、次元DayOfMonthを追加することです。これは、基本的に1 => 31の数値になります。上記の方がはるかに簡単です。 – whytheq

答えて

3

それは面白いですMDXのリファレンスを読んだだけで、私は盲目の路地に導いてくれました。ここで

は、各月の十五日のセットを取得することができます方法は次のとおりです。

WITH SET Months 
AS 
    [Calendar].[Month].Members 

SET FifteenthDays AS 
GENERATE(
    Months, 
    StrToSet('HEAD(DESCENDANTS(Months.Current,[Calendar].[Day]),1).Item(0).Lead(14)') 
    ) 

SELECT {} ON 0, 
FifteenthDays ON 1 
FROM TheCube 

あなたの日付パラメータを使用して初期命名セット「月数」をフィルタリングすることにより、あなたの要件に合うように、これを調整することができます。

  1. GENERATE/StrToSetの組み合わせは、最初のセットの各メンバー(「ヶ」)
  2. 現在の機能がCURRENTMEMBERのようなものであるに引用符の内側にMDXを適用されますが、適用される:

    はここで何が起こっているのですGenerate()内のセットに追加します。

  3. 子孫機能は、すべての月の日・レベルでの「子ども」を取得(私は私のキューブに追加世代がありますとしてではなく.Childrenよりも、これを使用していた - 週 - 月と日の間)
  4. HEAD機能を取得しますその月の最初の日。 (Timeディメンションの葉レベルが日付順にソートされていない場合は、ORDER関数でセットをラップする必要があります)。
  5. MDXは、シングルトンセット(HEAD({}、1)が常にシングルトンを返すか、空のセット)がメンバーであり、メンバー関数をそのメンバーに適用できることを自動的には認識しません。 Leadを適用する前に、Item()関数を使用する必要があります。なぜこの関数が動作するのかわかりません。なぜなら、ドキュメントによれば、別の目的があるからです。
  6. Lead(14)は、引数が0から始まるため、月の15日を指定します。
+0

魅力的な作品です!ありがとうございました。 :) –

+0

素敵なスクリプトSebTHU – whytheq

+1

素敵なアプローチ。'HEAD'と' LAG'は 'Item()'関数で必要なインデックスを参照する必要はないと思います: 'StrToSet( 'DESCENDANTS(Months.Current、[Calendar]。[Day])。 (14) ') ' – mxix

0

MDXアプローチ№1(和集合と計算されるメンバ):

WITH 
MEMBER [Measures].[Quantity15] AS 
SUM(
    [Calendar].[Day].[Day].Members, 
    IIF( 
     Right([Calendar].[Day].CurrentMember.Properties('Key'),2) = "15", 
     [Measures].[Quantity], 
     NULL 
    ) 
)  

SELECT 
    NON EMPTY { [Calendar].[Day].&[20100101]:[Calendar].[Day].&[20160315] } ON 0, 
    { [Measures].[Quantity15] } ON 1 
FROM [MyCube] 

MDXアプローチ№2(新メンバーなしで、セットをフィルタリング):

SELECT 
    NONEMPTY(
     {[Calendar].[Day].&[20100101]:[Calendar].[Day].&[20160315]}, 
     IIF(
      Right([Calendar].[Day].CurrentMember.Properties('Key'),2) = "15", 
      1, 
      NULL 
     ) 
    ) ON 0, 
    { [Measures].[Quantity] } ON 1 
FROM [MyCube]