はじめに
この記事は、Microsoft Power BI Advent Calendar 2022 に参加しています。
勇気を出して初めての投稿になります
今年、Power BI勉強会の「DAX Boot Camp1」で教えていただいた HASONEVALUE関数 について、書きとめておこうと思います。
HASONEVALUE関数 とは
columnName のコンテキストが 1 つの個別の値のみにフィルター処理されている場合、TRUE を返します。
それ以外の場合は、FALSE を返します。
HASONEVALUE関数 を使ってやりたいこと(完成形)
実際の勉強会では、HASONEVALUE関数 を使って What-if 分析 をするという内容でしたが、本稿ではシンプルな例で説明します。
クリームパン 250円、ドーナツ 200円、コーヒー 200円 を購入した際の合計金額 650円 に対して、「イートイン」の場合、「テイクアウト」の場合の税込み合計金額をスライサーで切り替えて表示させます。
例としてはどうかと思いますが(笑)、説明することを目的としているため、何卒ご容赦ください。
Excel の Power Pivot を使います。
イートインの場合
[イートイン(標準税率)]のスライサーを選択することにより、「合計金額」として 標準税率 10% の税込み金額を表示させます。
テイクアウトの場合
[テイクアウト(軽減税率)]のスライサーを選択することにより、「合計金額」として 軽減税率8% の税込み金額を表示させます。
準備
用意したテーブル
■ 販売テーブル(ファクトテーブル)
商品名 | 個数 |
---|---|
クリームパン | 1 |
ドーナツ | 1 |
コーヒー | 1 |
■ 商品マスタ
商品名 | 単価 |
---|---|
クリームパン | 250 |
ドーナツ | 200 |
コーヒー | 200 |
■ 消費税率マスタ
販売形態 | 消費税率 |
---|---|
イートイン(標準税率) | 10% |
テイクアウト(軽減税率) | 8% |
データモデル
商品名を キー にして、「商品マスタ」と「販売テーブル」間に 1対多 のリレーションシップを作成します。
スライサーとなる「消費税率マスタ」は、どのテーブルともリレーションシップでつながれていません。
計算列
「販売テーブル」に、「金額」を計算する 計算列 を追加しています。
金額=[単価]*[個数]
HASONEVALUE関数を使ってメジャーを作成する
さていよいよ本題の HASONEVALUE関数 を使って、メジャーを作成します。
合計金額:=
SUM(
'販売テーブル'[金額])*IF(
HASONEVALUE('消費税率マスタ'[販売形態]),VALUES('消費税率マスタ'[消費税率])+1,1
)
スライサーでいずれかの値が選択されている、つまり「消費税率マスタ」の「販売形態」列がひとつの値でフォルターされている場合に HASONEVALUE関数 は true を返すため、IF関数 の1つめの引き数の処理(消費税率の消費税を載せる)が実行されます。
スライサーでいずれの値も選択されていない場合には、 false が返され、IF関数 の2つめの引き数の処理(金額の合計に 1 を掛ける)が実行されるため、「金額」の合計が返ります。
うまくいきました!
イートインの場合
スライサーで[イートイン(標準税率)]が選択されているため、HASONEVALUE 関数は true を返し、IF関数の1つめの引数の処理が行われ「合計金額」として 標準税率 10% の税込み金額 715円 が表示させます。
テイクアウトの場合
スライサーで[テイクアウト(軽減税率)]が選択されているため、HASONEVALUE 関数は true を返し、IF関数 の1つめの引数の処理が行われ「合計金額」として 軽減税率8% の税込み金額 702円 が表示させます。
スライサーがかかっていないとき
「合計金額」として 金額の合計 = 税抜きの金額 650円 が表示されます。
Power BI でも試してみました
Power BI でも試してみたところ、Excel 同様にうまくいきました。
イートインの場合
テイクアウトの場合
スライサーが選択されていないとき
おわりに
おかげさまで、Power BI勉強会 がマイルストーンとなり、何とか学習を続けることができています。
勉強会の皆さんには、優しくアドバイスをしていただいたり、温かく励ましていただいたり、とても助けられています。
この場を借りてお礼申し上げます。本当にいつもありがとうございます
-
「DAX Boot Camp」は、みんなで DAX の訓練(勉強)する勉強会です。通常は月に一度、土曜日の午後に実施されています。 ↩