[Power BI] 暗黙のメジャーとはなにか、そしてなぜ非推奨なのか

# はじめに

:::note
本記事は「Microsoft Power BI Advent Calendar 2023」、11日目の記事です。
https://qiita.com/advent-calendar/2023/powerbi

**いいね！** 👍 よろしくお願いします！
:::

# 暗黙のメジャー（Implicit measures）とは

Power BIではDAXを使用してメジャーを定義します。レポート作成者がPower BI Desktopに記述したメジャーは**明示されたメジャー**と表現されます。

では**暗黙のメジャー**とはなんなのか。

暗黙のメジャーとは、テーブルの数値列、 **Σ** マークのついた項目をビジュアルにドラッグ＆ドロップすると作成されるものになります。既定では合計値が集計されますが、平均や、最大値、最小値などをUIで選択することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80467/05bd07fa-05c1-50f4-a230-f1d34cf620a5.png)

ビジュアルに数値列をドラッグアンドドロップすると

![2023-12-10_18-47-09.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80467/82fab47a-0b72-c640-cdb8-ae5bbd2c33b9.gif)

ビジュアルに設定してある項目の集計を変更すると、合計以外にも選択可。

- 合計
- 平均
- 最小値
- 最大値
- カウント（一意の値のみ）
- カウント
- 標準偏差
- 差異 （分散）
- 中央値
- 集計しない

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80467/3e9eb71d-7793-05c4-bd3e-e71bc631b082.png)

## 内部でメジャーが生成される

一見すると、自然な動作ですが、内部ではメジャーが生成されています。
パフォーマンスアナライザーを開き、ビジュアルを更新。DAXクエリをコピーします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80467/316a2ce1-1c9f-e739-6433-22cc0f69b3e8.png)

:::note
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
:::

```生成されたDAX.dax
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])　　//暗黙のメジャー
 ```

## 計算方法を変えてみる

既定の合計だけでなく、平均など、他の列を追加してみる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80467/6b23dd2b-7d6f-6637-26e8-76f7ed5c1c02.png)

### 生成されたDAXクエリを確認

```DAX.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と同じもの。
それぞれパフォーマンスを測定してみる。

```明示されたメジャー.dax
販売合計 = SUM('cso FactOnlineSales'[SalesAmount])
```

### 暗黙のメジャー

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80467/1a64e948-871d-6318-7955-990ae4eb0377.png)

### 明示されたメジャー

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80467/0e918346-0a40-b876-f979-fd0e69c691e9.png)

## 結果はほぼ変わらず

暗黙のメジャーでも、明示したメジャーでも、パフォーマンスは変わらないことがわかる。
繰り返し実行時のキャッシュも問題なく動作している。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80467/ab6ab93e-07e8-7852-b14f-f29016bf3fe7.png)

# ではなぜ非推奨なのか

パフォーマンスも問題がないならば、なぜ**非推奨**なのか。

## ①Excelで使用できない

暗黙のメジャーはExcelで利用することができない。以下の記事でも書いたが、作成したセマンティックモデルは、Power BIだけではなく、Excelでも消費されることを想定しておくべきだと考えたほうが良い。

https://qiita.com/akihiro_suto/items/4bd14b747bd5079d9ed1

### メジャーはExcelで利用できる

Excelでセマンティックモデルを開き、ピボットテーブルの画面ではメジャーが上に出てくる。
メジャーは問題なくピボットテーブルで使用ができ、期待した計算結果が表示される。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80467/2e92a75f-e89f-a880-0454-123732f69ebe.png)

### 暗黙のメジャーはExcelで利用できない（参考動画あり）

Power BIで暗黙のメジャーを作成するイメージで、ピボットテーブルに値を入れてみても、「行」や「列」に指定はできるが、「値」にいれることはできない。

![2023-12-10_21-37-50.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80467/3a5a5771-848a-1905-37bd-7090f28c9454.gif)

## ②表現できないビジネスロジックがある

暗黙のメジャーで用意されている計算の種類では、表現できる計算が少なすぎます。ビジネスに沿った、正しい数字を出すためにはやはりメジャーを自分で記述する必要があります。

暗黙のメジャーで表現できる単純な計算は暗黙のメジャーで、それ以外は記述する…という運用をすると、モデルのメンテナンスが困難になる可能性が高いため、やはりすべてメジャーは記述するというルールで最初から運用をすべきです。

## ③再利用できない

メジャーは一度定義したら、別のロジックでも繰り返し使うことができます。タイムインテリジェント関数を使用するには、そのベースメジャーが必要です。逆に言うとベースメジャーを定義しない限り、タイムインテリジェント関数を利用することはできません。

# まとめ

暗黙のメジャーは非推奨です。が、絶対に使ってはいけないということではありません。さくっとビジュアライズだけ作りたいときなど、利用すればより便利になるシーンもあります。

暗黙的、明示的、それぞれのメジャーの利点や運用上のメリットデメリットを理解して、効果的に利用してあげるのがいいと思います。