HASONEVALUE関数 を使う

# はじめに
この記事は、[Microsoft Power BI Advent Calendar 2022](https://qiita.com/advent-calendar/2022/powerbi "Microsoft Power BI Advent Calendar 2022") に参加しています。
勇気を出して初めての投稿になります:heart_exclamation::grinning:
今年、[Power BI勉強会](https://powerbi.connpass.com/ "Power BI勉強会")の「DAX Boot Camp[^example]」で教えていただいた **HASONEVALUE関数** について、書きとめておこうと思います。
[^example]:「DAX Boot Camp」は、みんなで DAX の訓練(勉強)する勉強会です。通常は月に一度、土曜日の午後に実施されています。

https://qiita.com/advent-calendar/2022/powerbi

# HASONEVALUE関数 とは

https://learn.microsoft.com/ja-jp/dax/hasonevalue-function-dax

>columnName のコンテキストが 1 つの個別の値のみにフィルター処理されている場合、TRUE を返します。
 それ以外の場合は、FALSE を返します。

# HASONEVALUE関数 を使ってやりたいこと(完成形)

実際の勉強会では、**HASONEVALUE関数** を使って **What-if 分析** をするという内容でしたが、本稿ではシンプルな例で説明します。
クリームパン 250円、ドーナツ 200円、コーヒー 200円 を購入した際の合計金額 650円 に対して、「イートイン」の場合、「テイクアウト」の場合の税込み合計金額をスライサーで切り替えて表示させます。
例としてはどうかと思いますが(笑):sweat_smile:、説明することを目的としているため、何卒ご容赦ください:pray:。

Excel の Power Pivot を使います。

:point_down:イートインの場合
［イートイン(標準税率)］のスライサーを選択することにより、「合計金額」として **標準税率 10％** の税込み金額を表示させます。
![001.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302412/2220d03f-f1ae-0dc4-670d-5038501ff270.jpeg "イートイン(標準税率)のスライサーが選択されている場合")
:point_down:テイクアウトの場合
［テイクアウト(軽減税率)］のスライサーを選択することにより、「合計金額」として **軽減税率8％** の税込み金額を表示させます。
![002.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302412/7c9fe4a0-95f5-8709-8151-ef0b7e01563f.jpeg "テイクアウト(軽減税率)が選択されている場合")

# 準備
## 用意したテーブル

■ 販売テーブル（ファクトテーブル）

| 商品名| 個数 |
|:-:|:-:|
| クリームパン |1 |
| ドーナツ  | 1 |
| コーヒー  | 1 |
 </details>

■ 商品マスタ

| 商品名| 単価 |
|:-:|:-:|
| クリームパン |250|
| ドーナツ  | 200 |
| コーヒー  | 200 |
 </details>

■ 消費税率マスタ

| 販売形態| 消費税率 |
|:-:|:-:|
| イートイン(標準税率) |10%|
| テイクアウト(軽減税率）  | 8％ |
</details>

## データモデル
![004.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302412/bbd9f573-6bb3-2201-ceaa-6ed19e72a432.jpeg "データモデル")

:::note info
商品名を **キー** にして、「商品マスタ」と「販売テーブル」間に **1対多** のリレーションシップを作成します。
スライサーとなる「消費税率マスタ」は、どのテーブルともリレーションシップでつながれていません。
:::

## 計算列
「販売テーブル」に、「金額」を計算する **計算列** を追加しています。


```
金額=[単価]*[個数]
```
![005.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302412/2b2e7e2e-0f78-3f6e-224c-8557dc5b055d.jpeg "計算列")

# HASONEVALUE関数を使ってメジャーを作成する
さていよいよ本題の **HASONEVALUE関数** を使って、メジャーを作成します。

```
合計金額:=
SUM(
    '販売テーブル'[金額])*IF(
     HASONEVALUE('消費税率マスタ'[販売形態]),VALUES('消費税率マスタ'[消費税率])+1,1
)
```
![006.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302412/2af5c778-6304-75ea-519d-a5609f119113.jpeg "メジャー 合計金額")


:::note info
スライサーでいずれかの値が選択されている、つまり「消費税率マスタ」の「販売形態」列がひとつの値でフォルターされている場合に HASONEVALUE関数 は true を返すため、IF関数 の1つめの引き数の処理（消費税率の消費税を載せる）が実行されます。
スライサーでいずれの値も選択されていない場合には、 false が返され、IF関数 の2つめの引き数の処理（金額の合計に 1 を掛ける）が実行されるため、「金額」の合計が返ります。
:::

# うまくいきました！
:point_down:イートインの場合
スライサーで［イートイン(標準税率)］が選択されているため、HASONEVALUE 関数は true を返し、IF関数の1つめの引数の処理が行われ「合計金額」として **標準税率 10％** の税込み金額 715円 が表示させます。
![001.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302412/2220d03f-f1ae-0dc4-670d-5038501ff270.jpeg "イートイン(標準税率)のスライサーが選択されている場合")
:point_down:テイクアウトの場合
スライサーで［テイクアウト(軽減税率)］が選択されているため、HASONEVALUE 関数は true を返し、IF関数 の1つめの引数の処理が行われ「合計金額」として **軽減税率8％** の税込み金額 702円 が表示させます。
![002.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302412/7c9fe4a0-95f5-8709-8151-ef0b7e01563f.jpeg "テイクアウト(軽減税率)が選択されている場合")
:point_down:スライサーがかかっていないとき
「合計金額」として **金額の合計 ＝ 税抜きの金額** 650円 が表示されます。
![003.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302412/1caf3cbe-0bc0-004e-55de-119c75f5d4e2.jpeg)

# Power BI でも試してみました
Power BI でも試してみたところ、Excel 同様にうまくいきました。

:point_down:イートインの場合
![007.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302412/e7aa327a-27be-3fc5-6fab-b1e845edce23.jpeg)
:point_down:テイクアウトの場合
![008.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302412/ef0d1f61-4d26-4715-8c8d-b57cc32f3b94.jpeg)
:point_down:スライサーが選択されていないとき
![009.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302412/27d3f188-f509-2a8f-1bfe-3d83998d7f76.jpeg)

# おわりに
おかげさまで、[Power BI勉強会](https://powerbi.connpass.com/ "Power BI勉強会") がマイルストーンとなり、何とか学習を続けることができています。
勉強会の皆さんには、優しくアドバイスをしていただいたり、温かく励ましていただいたり、とても助けられています。
この場を借りてお礼申し上げます。**本当にいつもありがとうございます** :heart_exclamation:

https://powerbi.connpass.com/