0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

イベントカレンダーをスライサーで処理しやすくするためのPower Queryを用いた展開

Posted at

背景

よく見かけるイベントカレンダー(下記(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
0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?