背景
よく見かけるイベントカレンダー(下記(1))は、人が管理・修正するので、おそらくこの形式が多いかと思います。
一方で、このままの形式ではスライサーなどで処理することが出来ません。
なので、日付テーブルとリレーションしやすい形式(下記(2))に変換する必要があるのですが、実装まで少し苦労しましたので、記事化しました。
今回はPower Queryを用いていますが、DAXでテーブルを記述することも可能ではないかと思います。
よくあるイベントカレンダー(1)
開始日 | 終了日 | イベント名 |
---|---|---|
2022/5/15 | 2022/5/18 | イベント1 |
2022/7/1 | 2022/7/5 | イベント2 |
日付テーブルとリレーション可能な形式(2)
イベント名 | 日付 |
---|---|
2022/5/15 | イベント1 |
2022/5/16 | イベント1 |
2022/5/17 | イベント1 |
2022/5/18 | イベント1 |
2022/7/1 | イベント2 |
2022/7/2 | イベント2 |
2022/7/3 | イベント2 |
2022/7/4 | イベント2 |
2022/7/5 | イベント2 |
具体的な手法
日付範囲のリストを返すカスタム関数を記述し、イベントカレンダーのテーブルにAddColumnsし、それを展開するだけで済みます。
1.カスタム関数の作成
空のクエリーを作成し、下記カスタム関数を「DateRange」などという名前で作成します。
(dStartDate as date, dEndDate as date)=>
let
DateRange = List.Generate(() => dStartDate, each _ <= dEndDate, each Date.AddDays(_,1))
in
DateRange
2.イベントテーブルにカスタム関数の列を追加
「列の追加」→「カスタム関数の呼び出し」で上記の関数を呼び出します。
この時、引数の対象を忘れずに「列名」にしてから日付範囲の列名を選択します(ちょっとはまった)。
正常に関数が追加されると、日付列が現れます。
開始日 | 終了日 | イベント名 | 日付 |
---|---|---|---|
2022/5/15 | 2022/5/18 | イベント1 | List |
2022/7/1 | 2022/7/5 | イベント2 | List |
3.追加したカスタム列を展開
日付列は「List」になっていますので、これを展開すれば完了です
最終的な本体のコードはこのようになります。
let
ソース = Excel.Workbook("EventCalendar.xlsx"), null, true),
tblEventTable_Table = ソース{[Item="tblEventTable",Kind="Table"]}[Data],
変更された型 = Table.TransformColumnTypes(tblEventTable_Table ,{ {"イベント名", type text}, {"開始日", type date}, {"終了日", type date}}),
呼び出されたカスタム関数1 = Table.AddColumn(変更された型, "日付", each DateRange([開始日], [終了日])),
展開されたDateRange1 = Table.ExpandListColumn(呼び出されたカスタム関数1, "日付")
in
展開されたDateRange1