2017-02-02 19 views
2

を開始&終了ディメンションからプロジェクト期間(日)私は少し単純化されていたシナリオ次ていますDAX対策:日付

は、ファクトテーブルのコスト:

date, project_key, costs € 

プロジェクト寸法:

project_key, name, starting date, ending date 

日寸法:

プロジェクトのディメンションからの開始日と終了日を使用して、プロジェクトの期間を日数にする尺度を作成する必要があります。 最初のの課題は、ファクトテーブル内のすべての日のトランザクションがないことです。プロジェクトの開始日は1月1日であるかもしれないが、最初のコスト取引は実際には1月の15日のようなテーブルにある。したがって、フィルタコンテキストで開始日と終了日の間の日数を計算する必要があります。

したがって、の2番目のチャレンジはフィルタコンテキストです。ユーザーは2月のみを表示することができます。したがって、プロジェクトの開始日は1.6.2016で終了日は1.11.2016であり、ユーザーは9月のみを表示する必要があり、30日しか表示されません。

第3のの課題は、複数のプロジェクトの日を表示することです。したがって、ユーザーが1日だけを選択すると、進行中のすべてのプロジェクトの数が表示されます。

私は解決策につながる助けに感謝します。だから、必要に応じてさらに詳しいことを躊躇しないでください。

編集:ここでは、この優れたを説明するための画像です:

enter image description here

アップデート2017年2月7日

はまだこの解決のために、単一のメジャーを作成しようとしています。日付、プロジェクト、またはそのままの状態で使用できるユーザーを測定します。現在進行中のプロジェクト数を1日に計算すると、簡単な解決策になりますが、日付表でフィルタリングするだけです。 2017年2月9日

アップデートはあなたの努力ありがとうございました。最終的に、私は事実テーブルに基づいていない計算は非常に難しいと確信しています。この特定のケースでは、すべての要件を満たすために日付とプロジェクトIDでCROSS JOINを使用して新しいテーブルを作成しました。 1つの選択肢として、開始日と終了日をファクトテーブルに独自の行としてコストゼロで追加する方法もありました。実際のソリューションには、さらに考慮する必要のある次元があります。

+0

開始日から終了日までの期間を計算する必要がありますか、またはそれらの間のコストを計算する必要がありますか?質問を編集して、基本的なサンプルデータと期待される結果を含めることができますか? –

+0

開始日と終了日の間の期間(コンテキストが他の日付でフィルタリングされていない場合)。私はデータを追加します。 – Henri

答えて

3

あなたが作成する必要が期待される結果を取得するには計算された列とメジャーでは、計算された列では、プロジェクトが実行された日付のプロジェクト数と、経過日数を計測するメジャーを、各プロジェクトでアカウントフィルタを使用します。

計算された列は、この式を使用してdim_dateテーブル内に作成する必要があります:

Count of Projects = 
SUMX (
    FILTER (
     project_dim, 
     [starting_date] <= EARLIER (date_dim[date]) 
      && [ending_date] >= EARLIER (date_dim[date]) 
    ), 
    1 
) 

尺度は、この表現を使用してproject_dimテーブルに作成する必要があります。

Duration (Days) = 
DATEDIFF (
    MAX (MIN ([starting_date]), MIN (date_dim[date])), 
    MIN (MAX ([ending_date]), MAX (date_dim[date])), 
    DAY 
) 
    + 1 

あなたは意志の結果をgetは次のようなものです:

enter image description here

そして、このおdim_dateテーブルの上にスライサーやフィルターを使用して、週

enter image description here

をフィルタリングする場合SSAS 2014年UPDATEサポート - DATEDIFF()はSSAS 2016

まずので利用可能ですすべて、それは測定 2つの異なるものだが、あなたのユーザーに表示されている1つのメジャーだけを望むことが重要です。最初の期待結果では、各プロジェクトで予想される結果2と3(OP内)の中で、各プロジェクトでアカウントのフィルタリングを受け入れる間に、各日付で実行されているプロジェクトの数を取得したい場合は、date_dimです。

メジャーを作成して両方のメジャーを1つにまとめ、HASONEFILTERを使用して各メジャーを実行するコンテキストを決定することができます。折り返し対策を続ける前に、DATEDIFF機能を使用して上に掲示したメジャーを置き換える以下のメジャーを確認してください。

各日付のプロジェクト数を決定するために必要な前回の計算列を作成した後、Duration Measureというメジャーを作成すると、このメジャーはユーザーによって使用されませんが、最終的なメジャーを計算させます。

Duration Measure = SUMX(FILTER (
     date_dim, 
     date_dim[date] >= MIN (project_dim[starting_date]) 
      && date_dim[date] <= MAX (project_dim[ending_date]) 
    ),1 
) 

は今、ユーザーが対話する必要があり、最終的な措置は、次のように書くことができます。

Duration (Days) = 
IF (
    HASONEFILTER (date_dim[date]), 
    SUM (date_dim[Count of Projects]), 
    [Duration Measure] 
) 

この措置は、コンテキストを決定し、指定されたコンテキストのための右の措置を返します。したがって、両方のテーブルに同じメジャーを追加すると、目的の結果が返されます。この解決策にもかかわらず

enter image description here

はそれがあまりにもパワー ピボットに働く力BIにdemostratedされます。

これが役立つかどうか教えてください。

+0

私は言及を忘れていましたが、このソリューションはSQL Server 2014 CU1 SSASで開発されました。 DATEDIFFやMAXに複数の値があるように見えます。 – Henri

+0

@Henri、私はSSAS 2014でのDATEDIFFの不足の代替案で私の答えを更新しました。また、DAXの両方の測定値が1つにまとめられています。それが役に立てば幸い。 –

1

まず私は2人の関係を作成します。

  1. project_dim [project_key] => costs_fact [project_key]
  2. date_dim [日付] => costs_fact [日付]

コストの尺度が希望正確には:SUM(costs_fact [costs])

Dateディメンションのフィルタコンテキストを変更するには、Duration(days)メジャーにCALCULATEが必要です。これは、両方のテーブルの選択された行に基づいて、オンザフライでproject_dimとdate_dimの関係を効果的に計算します。

Duration (days) = 
CALCULATE (
    COUNTROWS (date_dim), 
    FILTER (
     date_dim, 
     date_dim[date] >= MIN (project_dim[starting_date]) 
      && date_dim[date] <= MAX (project_dim[ending_date]) 
    ) 
) 
+0

すばらしい答え!これは私自身も手を振ったことがありますが、尺度のための正しい形を引き出すためのスキル/知識を持っていません。DISTINCTCOUNT(costs_fact [project_key])を使用して現在の結果を複数倍にすることができると思いますので、プロジェクトフィルターを使用せずに毎月のプロジェクト日を検索する場合、すべてのプロジェクトの日数が表示されますか? – Henri

+0

まず、アレハンドロの返信に記載されている「プロジェクト数」尺度のようなものが必要になります。 –

1

私は、彼らが実際に異なる文脈の下で同じ意味を持っていないとして、あなたは別の計算されたコラム/対策に対策Duration (days)を分離することをお勧めします。

まず、日付/コストとプロジェクト/コストの間に1対多の関係を作成します。予想される結果1について

relationship

(シングルクロスフィルタ方向又はフィルタコンテキストが誤って計算中に適用される注)、Iは、日付ディメンションで算出列を作成したがProject (days)と呼ばれます。ある日、進行中のプロジェクトの数を数えます。

Project (days) = 
COUNTROWS(
    FILTER(
     projects, 
     dates[date] >= projects[starting_date] && 
     dates[date] <= projects[ending_date] 
    ) 
) 

Project (days)

P.S.毎週または毎月の集計結果を得たい場合は、さらにメジャーを作成してProject (days)を集計することができます。次のように期待される結果2と3については、対策Duration (days)

されています:

Duration (days) = 
COUNTROWS(
    FILTER(
     dates, 
     dates[date] >= FIRSTDATE(projects[starting_date]) && 
     dates[date] <= FIRSTDATE(projects[ending_date]) 
    ) 
) 

期待通りの結果が次のようになります。 result 1 result 2