皆さんこんにちは、truestarのtokuです。
少し前にtableauをPowerBIで再現しようとする機会がありまして、その中でよく直面した問題が、
tableauではよく使われるLOD計算をどう再現するかでした。
というわけで今回は、tableauでもよく使うLOD計算をPowerBIで再現する方法をご紹介します。
準備
以下のダミーデータを使用して説明していこうと思います。
tableauの見本
再現したい内容は以下になります。
各計算式は以下に記載します。
- エリア合計 :{ FIXED [エリア] :SUM([売上])}
- カテゴリー合計 :{ FIXED [カテゴリー] :SUM([売上])}
- エリアカテゴリー合計:{ FIXED [エリア] ,[カテゴリー] :SUM([売上])}
1.ALLEXCEPTを使った再現
まずはALLEXCEPTを使った再現方法を説明いたします。
- tableauのテーブルをPower BIで作成する
- 以下のメジャーを作成してテーブルに加える
エリア合計 =CALCULATE(SUM('テーブル'[売上]),ALLEXCEPT('テーブル','テーブル'[エリア]))
そして出来上がった式をテーブルに入れてみると…再現できていますね!
- 他のメジャーも同様に作成してみる
以下の2つも作成してみます
カテゴリー合計 = CALCULATE(SUM('テーブル'[売上]),ALLEXCEPT('テーブル','テーブル'[カテゴリー]))
エリアカテゴリー合計 =CALCULATE(SUM('テーブル'[売上]),ALLEXCEPT('テーブル','テーブル'[エリア],'テーブル'[カテゴリー]))
そしてテーブルに入れてみると…すべて再現できました!
仕組みの説明(CALCULATE,ALLEXCEPT)
それではなぜこのような計算結果になったのかを説明していきます。
- CALCULATE関数
CALUCULATE関数は非常にわかりやすく、使い方のイメージは以下です。詳細はCALCULATE関数の公式をご覧下さい。
- ALLEXCEPT関数
ALLEXCEPT関数は名前の通り、指定したもの以外すべてのディメンションを除外したテーブルを作成します。詳細はALLEXCEPT関数の公式をご覧下さい。
この2つを組み合わせることで、以下のような形でLOD計算(Fixed)を再現しています。
ALLEXCEPTで作成されるテーブルを、CALUCULATEのフィルター条件に入れるイメージです。
注意事項
ただしこの再現方法には注意点があります。
それは各関数がDirectQuery モードでの使用はサポートされていない点です。
ストレージモードがインポートでないとDAXが使用できないのでご注意ください。
2.Groupbyを利用する方法
もう1つは中間テーブルを作成し、キーで結合することで再現する方法です。
エリア合計だけ作成してみようと思います。以下の式で結合用のテーブルを作成します。
エリア合計用 =GROUPBY ('テーブル','テーブル'[エリア],"エリア合計",SUMX(CURRENTGROUP(),'テーブル'[売上]))
こちらをエリアをキーにして元のテーブルに結合します。
そして「エリア合計用テーブル」のエリア合計メジャーをテーブルに入れると、同様に再現可能です。
これは単純な仕組みで、Fixedで行っていた計算を中間テーブルとして実際に作成し、結合することで再現しています。
まとめ
いかがでしたでしょうか。
意外と簡単に再現できるのでぜひお試しください!
またtruestarではデータ活用に関する様々な業務を承っております。是非こちらからご相談ください。ではまた!