PowerBI Dax 日付判定列について
はじめに
データリフレッシュ日を保持するテーブルを作成したことはありますか?
データリフレッシュテーブルがあると、データが更新された年月日に対して、前月比や前年同月比等を集計することができるようになります。
今回は前回記事に引き続き、カレンダーテーブル(Dim_Calender)にデータ最新年月日に対する判定列の追加について書いていきたいと思います。
前回記事はこちら
データリフレッシュテーブルの追加
今回はPower Queryでデータリフレッシュテーブル(Dim_Refresh)を追加します。
Power Queryエディタを開き、下記コードを入力し「閉じて適用」します。
let
ソース = DateTime.Date(DateTime.FixedLocalNow()),
テーブルに変換 = #table(1, {{ソース}}),
列名変更 = Table.RenameColumns(テーブルに変換,{{"Column1", "Refresh_Date"}}),
/*更新時刻も必要であれば、type datetimeにする*/
型変更 = Table.TransformColumnTypes(列名変更,{{"Refresh_Date", type date}})
in
型変更
PowerBIを使用し始めた頃、詳細エディタからクエリをコピぺすれば簡単にクエリ移植できることを知らず、1ステップずつGUIでクエリを追加していました。
そんな虚無な時間を過ごさないようご注意ください。
詳細エディタでは、実行されるステップ毎に改行されたクエリを確認できます。
この詳細エディタについて、クエリをネストしたり、列追加と型変更を同時に行ったりと色々なことができるので、今後はそういった記事も書いていけたらと思います。
リレーションについて
今回追加したDim_Refreshテーブルは、どのテーブルともリレーションを設定しないテーブルです。
テーブルを追加しても、常にリレーションを作成する必要はありません。
どこにもリレーションがつながっていないほうが、かえって都合がいい場合もあるので、データモデルを作成する際は本当に必要なリレーションなのかよく考えてみてください。
BIツールはデータモデルが命です。
ビジュアル作成難易度や完成度は、データモデルに大きく左右されます。
データ最新年月に対する各種判定列の追加
当月判定
当月判定 =
/*データ最新年月*/
var Refresh_YearMonth =
FORMAT(
SELECTEDVALUE(Dim_Refresh[Refresh_Date]),
"yyyy/mm"
)
Return
IF(
FORMAT([Date],"yyyy/mm") = Refresh_YearMonth,
TRUE(),
FALSE()
)
前月判定
前月判定 =
/*データ最新年月*/
var Refresh_YearMonth = SELECTEDVALUE(Dim_Refresh[Refresh_Date])
/*データ最新年月の前月*/
var Previous_YearMonth =
FORMAT(
EOMONTH(Refresh_YearMonth,-1),
"yyyy/mm"
)
Return
IF(
FORMAT([Date],"yyyy/mm") = Previous_YearMonth,
TRUE(),
FALSE()
)
当四半期判定
当四半期判定 =
/*データ最新*/
var Refresh_YearMonth =
FORMAT(
SELECTEDVALUE(Dim_Refresh[Refresh_Date]),
"yyyy\Qq"
)
Return
IF(
FORMAT([Date],"yyyy\Qq") = Refresh_YearMonth,
TRUE(),
FALSE()
)
前四半期判定
前四半期判定 =
/*データ最新年月*/
var Refresh_YearMonth = SELECTEDVALUE(Dim_Refresh[Refresh_Date])
/*データ最新年月の前月*/
var Previous_YearMonth =
FORMAT(
EOMONTH(Refresh_YearMonth,-3),
"yyyy\Qq"
)
Return
IF(
FORMAT([Date],"yyyy\Qq") = Previous_YearMonth,
TRUE(),
FALSE()
)
前年同月判定
前年同月判定 =
/*データ最新年月*/
var Refresh_YearMonth = SELECTEDVALUE(Dim_Refresh[Refresh_Date])
/*データ最新年月の前月*/
var Previous_YearMonth =
FORMAT(
EOMONTH(Refresh_YearMonth,-12),
"yyyy/mm"
)
Return
IF(
FORMAT([Date],"yyyy/mm") = Previous_YearMonth,
TRUE(),
FALSE()
)
直近12カ月
直近12カ月 =
/*データ最新*/
var Refresh_Date = SELECTEDVALUE(Dim_Refresh[Refresh_Date])
/*前年同月末*/
var Start_Date = EOMONTH(Refresh_Date,-12)
/*当月末*/
var End_Date = EOMONTH(Refresh_Date,0)
Return
IF(
Start_Date < [Date] && [Date] <= End_Date,
TRUE(),
FALSE()
)
おわりに
カレンダーテーブルとファクトテーブルの間に適切なリレーションが設定されていれば、追加した判定列をDax式に組み込んだり、ビジュアルにフィルタをかけたりすることができます。
参考になれば幸いです。
最後までお読みいただき、ありがとうございました。