今回のテーマ
最近よく聞かれるので、まとめておこうと思いました。
まとめておくといっても、Tips レベルの話。
タイトルの通り、**「デフォルトで今月を表示したい」**というもの。
今回使うデータ
TestData っていうテーブルと Calendar テーブルがあるとてもシンプルなもの。
TestData テーブルはこんな感じで 1,000 行のテーブル。(ちなみにこのテストデータは https://www.mockaroo.com/ っていうテストデータを作るサービスで作ったもの)
Calendar テーブルはこんな感じで、TestData テーブルの日付列の最小値から最大値までの日付を保持させています。
Calendar =
var BaseCalendar = CALENDAR( MIN( TestData[date] ), MAX( TestData[date] ) )
RETURN
GENERATE(
BaseCalendar,
var BaseDate = [Date]
var YearNumber = YEAR(BaseDate)
var MonthNumber = MONTH(BaseDate)
var DateNumber = DAY(BaseDate)
var DayNumber = WEEKDAY(BaseDate, 1)
RETURN ROW(
"年番号", YearNumber,
"年", FORMAT(BaseDate, "yyyy年"),
"月番号", MonthNumber,
"月", FORMAT(BaseDate, "mm月"),
"月(英語)", SWITCH(MonthNumber, 1, "Jan", 2, "Feb", 3, "Mar", 4, "Apr", 5, "May", 6, "Jun", 7, "Jul", 8, "Aug", 9, "Sep", 10, "Oct", 11, "Nov", 12, "Dec", ""),
"年月番号", FORMAT(BaseDate, "yyyymm"),
"年月", FORMAT(BaseDate, "yyyy年mm月"),
"日番号", DateNumber,
"曜日番号", DayNumber,
"曜日", SWITCH(DayNumber, 1, "日", 2, "月", 3, "火", 4, "水", 5, "木", 6, "金", 7, "土",""),
"曜日(英語)", SWITCH(DayNumber, 1, "SUN", 2, "MON", 3, "TUE", 4, "WED", 5, "THU", 6, "FRI", 7, "SAT",""),
"週番号", (YearNumber * 100) + WEEKNUM(BaseDate, 1),
"週", FORMAT(WEEKNUM(BaseDate, 1), "第00週"),
"平日休日区分", SWITCH(DayNumber, 1, "休日", 2, "平日", 3, "平日", 4, "平日", 5, "平日", 6, "平日", 7, "休日",""),
"相対月数", DATEDIFF(TODAY(), BaseDate, MONTH)
)
)
Power BI のスライサーの癖を利用する
Power BI で日付を選択させる場合、よく使われるのがビジュアルのスライサー。
日付を指定するとこんなふうに From - To で表示されるやつ。もちろん期間指定だけでなく、矢印のところをクリックすると、
- 指定の間の値
- 次の値より前:
- 次の値より後:
- 一覧
- ドロップダウン
- 相対日付
- 相対時間
と選択できます。
で、例えば一覧にした場合。
こんな感じですべての日付がならび、チェックボックスをチェックすることで、対象の日付を複数選択することができ、データは対象日付で絞り込まれます。
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
3つの日付で絞り込むとこうなる。
さて、この状態で、Power BI Service にレポートを発行するとどうなるか?
やってみればわかることだけど、デフォルトでこれら3つの日付で絞り込まれた状態が初期表示されます。
そう、Power BI のレポートは発行時のフィルターやスライサーの状態、ブックマークなどをデフォルトとして、表示されるのです。
これ、感覚的に分かっている人が多いと思うけど、これを意識している人は少ない気がするので、押さえておくととてもよいのです。
複数ページで構成されているレポートの場合は、発行時に表示していたページがデフォルトのページになります。
これが Power BI のクセ。(← 仕様ともいう)
で、ここからが本題。
今回のテーマ、**「デフォルトで今月が表示したい」**を実現してみます。
ひとつ条件を加えておくと、当然今月だけでなく、他の年月も選択可能でなければならない。(← よく言われるやつ)
ちなみにスライサーに日付型の列を指定すると [相対日付] が選択できます(さっきのリストにあったやつ)
これで今月ってイケそうじゃない?って思うでしょ😇?
いちおうイケます。
一番左を [現在の] にして、一番右を [月] にすれば、これで常に今月のデータからスタートします。
でも、これだと「じゃあ先月が見たい!」ってなったとき、ここからツーステップ必要になります。
一番左を [最近] にして、一番右を [月 (暦)] にすると 2021/04/01 - 2021/04/30 になります。
なるんだけど、なかなかに直感的とは言えないわけです。
じゃあ、カレンダーで [年月] 列を作っておいて、年月をスライサーに入れればよくない?って思う。
うん、これでも悪くはない。
けど、これだとデフォルト表示が今月にならない。
この画像の状態で Power BI Service へ発行すると、常に**「2021年05月」がデフォルト表示になっちゃう。
なので、チェックを外すしかない。そうすると、デフォルト表示がスライサーによる指定なし、つまり全期間の集計値**が表示されちゃう。
そこから、当月をワンクリックすれば、今月のデータになるっちゃぁなるんだけど、その手間すら面倒だ!っていうケースはよくあるわけです。
というか、よくリクエストされる。
でもさ、今月って判断付かなくね?
そう、言わずもがな、今月は毎月変わるのです。この記事を書いている今日は2021年5月13日なので、今月は2021年5月。でもあと19日後の今月は2021年6月になる。
「なにを当たり前のことを言っているんだ、こいつは?」って思うかもしれないけど、実はこれが困るのです。
要は「今月」という文字列が差す実際の年月が時期によって変わるということ。
なので、みんなできないできないって言うんです。
でも実はとてもシンプル。
カレンダーテーブルに新しい列をこうやって追加しちゃえば良いのです。
前提としてはカレンダーテーブルにこんな感じで判断がつく列があればよい。
パターン1は [相対月数] という列を保持していて、当月との差を持たせてあるので、それが 0 なら当月ということになるので "今月" っていう文字列を返してる。
パターン2は [年月番号] という列を保持しているので、TODAY 関数で今日の日付から FORMAT 関数で年月 (yyyymm) という文字列を作って、比較。一致したら "今月" っていう文字列を返してる。
大差ないので、お好きな方でやればいいと思います。
[パターン1]
月(表示用) = IF( [相対月数] = 0, "今月", [年月] )
[パターン2]
月(表示用)2 =
VAR TodayYearMonth = FORMAT( TODAY(), "yyyymm" )
RETURN
IF( [年月番号] = TodayYearMonth, "今月", [年月] )
いずれにしても、これで当月なら「今月」、それ以外は実際の「年月」を持つ列が作れたので、これをスライサーに入れればよい。
こんな感じ。
比較するために、画像にある右下のテーブルはスライサーの影響を受けないように相互作用を OFF にしてあります。
カードにはきちんと 2021年5月 の値が表示されていることがわかると思う。
スライサーはドロップダウンに変更しておいて、今月にチェックを入れた状態で、Power BI Service に発行すれば、デフォルト表示が常に「今月」になるというわけ。
Power BI は選択された文字列である**「今月」**を常に選択しておいてくれるので、2021年6月に入ったら、今月=2021年6月ということになるので、これで目標達成!
ね、簡単でしょ?
おわり
はい、ということで今回は以上です。
Power BI で**「今月」**をデフォルト表示にする方法をお伝えしました。
最後まで読んでいただきありがとうございました。また気が向いたら、Power BI Tips シリーズを書きます。
皆様からのリクエスト、お待ちしております。
何かリクエストがあれば、以下までー🤗
Twitter: https://twitter.com/yugoes1021
Facebook: https://www.facebook.com/yugoes1021
LinkedIn: https://www.linkedin.com/in/yugoes1021/