はじめに
本記事は「Microsoft Power BI Advent Calendar 2023」、11日目の記事です。
https://qiita.com/advent-calendar/2023/powerbi
いいね! 👍 よろしくお願いします!
暗黙のメジャー(Implicit measures)とは
Power BIではDAXを使用してメジャーを定義します。レポート作成者がPower BI Desktopに記述したメジャーは明示されたメジャーと表現されます。
では暗黙のメジャーとはなんなのか。
暗黙のメジャーとは、テーブルの数値列、 Σ マークのついた項目をビジュアルにドラッグ&ドロップすると作成されるものになります。既定では合計値が集計されますが、平均や、最大値、最小値などをUIで選択することができます。
ビジュアルに数値列をドラッグアンドドロップすると
ビジュアルに設定してある項目の集計を変更すると、合計以外にも選択可。
- 合計
- 平均
- 最小値
- 最大値
- カウント(一意の値のみ)
- カウント
- 標準偏差
- 差異 (分散)
- 中央値
- 集計しない
内部でメジャーが生成される
一見すると、自然な動作ですが、内部ではメジャーが生成されています。
パフォーマンスアナライザーを開き、ビジュアルを更新。DAXクエリをコピーします。
DAXクエリについては、以下記事にまとめています。
[DAX Studio] DAX クエリの書き方①
https://qiita.com/akihiro_suto/items/7c56847987f2cf8a441e
[DAX Studio] DAX クエリの書き方②
https://qiita.com/akihiro_suto/items/05cf9a620ee069c85517
[DAX Studio] DAX クエリの書き方③
https://qiita.com/akihiro_suto/items/2d33908ba159befeb304
[DAX Studio] DAX クエリの書き方④
https://qiita.com/akihiro_suto/items/78c739f7cfd91bdf3b43
DEFINE
VAR __DS0Core =
SUMMARIZECOLUMNS(
ROLLUPADDISSUBTOTAL('cso DimProduct'[BrandName], "IsGrandTotalRowTotal"),
"SumSalesAmount", CALCULATE(SUM('cso FactOnlineSales'[SalesAmount])) //暗黙のメジャー
)
VAR __DS0PrimaryWindowed =
TOPN(502, __DS0Core, [IsGrandTotalRowTotal], 0, 'cso DimProduct'[BrandName], 1)
EVALUATE
__DS0PrimaryWindowed
ORDER BY
[IsGrandTotalRowTotal] DESC, 'cso DimProduct'[BrandName]
自動で生成されたメジャーは以下の部分。DAXでメジャーが書かれているのが確認できる。
"SumSalesAmount", CALCULATE(SUM('cso FactOnlineSales'[SalesAmount]) //暗黙のメジャー
計算方法を変えてみる
既定の合計だけでなく、平均など、他の列を追加してみる。
生成されたDAXクエリを確認
// DAX Query
DEFINE
VAR __DS0Core =
SUMMARIZECOLUMNS(
ROLLUPADDISSUBTOTAL('cso DimProduct'[BrandName], "IsGrandTotalRowTotal"), //合計
"AverageSalesAmount", CALCULATE(AVERAGE('cso FactOnlineSales'[SalesAmount])), //平均
"MaxSalesAmount", CALCULATE(MAX('cso FactOnlineSales'[SalesAmount])), //最大値
"StandardDeviationSalesAmount", CALCULATE(STDEV.P('cso FactOnlineSales'[SalesAmount])), //標準偏差
"VarianceSalesAmount", CALCULATE(VAR.P('cso FactOnlineSales'[SalesAmount])) //分散
)
VAR __DS0PrimaryWindowed =
TOPN(502, __DS0Core, [IsGrandTotalRowTotal], 0, 'cso DimProduct'[BrandName], 1)
EVALUATE
__DS0PrimaryWindowed
ORDER BY
[IsGrandTotalRowTotal] DESC, 'cso DimProduct'[BrandName]
結局メジャーはつくられている
ということで、ドラッグアンドドロップをして合計値などを出す作業をしても、バックグラウンドでは結局メジャーが生成されていることがわかった。
パフォーマンスの測定
メジャーを手動で作成。暗黙のメジャーの「合計」で自動生成されたDAXと同じもの。
それぞれパフォーマンスを測定してみる。
販売合計 = SUM('cso FactOnlineSales'[SalesAmount])
暗黙のメジャー
明示されたメジャー
結果はほぼ変わらず
暗黙のメジャーでも、明示したメジャーでも、パフォーマンスは変わらないことがわかる。
繰り返し実行時のキャッシュも問題なく動作している。
ではなぜ非推奨なのか
パフォーマンスも問題がないならば、なぜ非推奨なのか。
①Excelで使用できない
暗黙のメジャーはExcelで利用することができない。以下の記事でも書いたが、作成したセマンティックモデルは、Power BIだけではなく、Excelでも消費されることを想定しておくべきだと考えたほうが良い。
メジャーはExcelで利用できる
Excelでセマンティックモデルを開き、ピボットテーブルの画面ではメジャーが上に出てくる。
メジャーは問題なくピボットテーブルで使用ができ、期待した計算結果が表示される。
暗黙のメジャーはExcelで利用できない(参考動画あり)
Power BIで暗黙のメジャーを作成するイメージで、ピボットテーブルに値を入れてみても、「行」や「列」に指定はできるが、「値」にいれることはできない。
②表現できないビジネスロジックがある
暗黙のメジャーで用意されている計算の種類では、表現できる計算が少なすぎます。ビジネスに沿った、正しい数字を出すためにはやはりメジャーを自分で記述する必要があります。
暗黙のメジャーで表現できる単純な計算は暗黙のメジャーで、それ以外は記述する…という運用をすると、モデルのメンテナンスが困難になる可能性が高いため、やはりすべてメジャーは記述するというルールで最初から運用をすべきです。
③再利用できない
メジャーは一度定義したら、別のロジックでも繰り返し使うことができます。タイムインテリジェント関数を使用するには、そのベースメジャーが必要です。逆に言うとベースメジャーを定義しない限り、タイムインテリジェント関数を利用することはできません。
まとめ
暗黙のメジャーは非推奨です。が、絶対に使ってはいけないということではありません。さくっとビジュアライズだけ作りたいときなど、利用すればより便利になるシーンもあります。
暗黙的、明示的、それぞれのメジャーの利点や運用上のメリットデメリットを理解して、効果的に利用してあげるのがいいと思います。