2016/03/13

Power BI - 24 - Power BI Desktop と 日付テーブル

タイム インテリジェンス関数を使いたいです。なぜなら、期間(年、月、前年とか)を伴う比較集計にとても便利だから。
MSDN : タイム インテリジェンス関数 (DAX)
Office.com : Power Pivot in Excel のタイム インテリジェンス
ファクトテーブル"受注"の "受注日" と "締切日" は 受注と請求に関連する日付とみなしていくつかの集計を行えるようにしてみる。

ここで必要になるのは 日付テーブル。なので、データモデルにテーブル"カレンダー"を追加する。
日付テーブル
粒度は日単位で連続した日付であることが必要。そして、タイム インテリジェンス関数を使用する場合、データモデルに日付テーブルを追加し関連するテーブルのカラムとリレーションを設定しなければならない。

日付テーブルの追加
[モデリング] タブ - [新しいテーブル]
CALENDARAUTO (MSDN - CALENDARAUTO 関数 (DAX))
データモデルに存在する最初と最後の日付が含まれる範囲の連続データを生成する。計算列 / 計算されたテーブルをもとに連続データの生成はできない。引数(1~12)で期末の指定が可能。

CALENDAR (MSDN - CALENDAR 関数 (DAX))
引数で指定する範囲の日付連続データを生成する。データモデルにない過去未来の日付について使用する場合に適している。

ADDCOLUMNS (MSDN - ADDCOLUMNS 関数 (DAX))
"新しい列" をポチポチと追加してもよいのだけど、既定のカラム名は "Date" だから、ADDCOLUMNS 関数で日付テーブルを完成させてもよい。

カレンダー =
ADDCOLUMNS (
    CALENDARAUTO (),
    "年"YEAR ( [Date] ),
    "月"FORMAT ( [Date], "m月" ),
    "年月"FORMAT ( [Date], "yyyy年mm月" ),
    "MonthNumber"MONTH ( [Date] )
)

カラム"月" は "m月" でフォーマットした文字列なので、同時に用意した カラム"MonthNumber"で並び替えを指定する。

リレーションの設定
  • 'カレンダー'[日付] → '受注'[受注日]
  • 'カレンダー'[日付] → '受注'[締切日]

カーディナリティが 多対一 なのは当然。クロス フィルターの方向が "単一" なのは、ファクトテーブルにフィルタが適用されたとき日付テーブルの連続したデータを維持するため。この設定はPower BI Desktopが自動的に設定してくれる。
アクティブにできるリレーションはひとつだのだけど、この場合は特段の指定をしなくても関連データを参照できる。'受注'[締切日] のリレーションはアクティブではないから USERELATIONSHIP 関数などを使用して関連データを取得することになる。
分析の用途によっては日付テーブル(ディメンジョンテーブル)をそれぞれに用意することもあろうかと。

メジャーを追加
受注額 =
SUM ( '受注'[明細計] )

請求額 =
CALCULATE ( SUM ( '受注'[明細計] )USERELATIONSHIP ( '受注'[締切日], 'カレンダー'[日付] ) )

複数の集計を実施できる

USERELATIONSHIP (MSDN - USERELATIONSHIP 関数 (DAX))

2 件のコメント:

匿名 さんのコメント...

PowerBIに四苦八苦して流れてきた者です。
複数にまたがるデータの月別集計をどうしたら良いか探していました。
この記事のおかげで、ようやく出来ました!
助かりました。

本家のヘルプも直訳の日本語でまったく要領を得ず、
かといって、こちらのようにノウハウを公開している情報もなかなかなく…。

MukkuMuku さんのコメント...

新しい情報などポストしてなくて、ごめんなさいね。
そのうち再開します。