[Power BI]スナップショットABC分析を実装する② ~TREATAS関数や中間テーブルを使うぞ編~


はじめに

スネップショットABC分類についての続編です。

前の記事はこちら。

また、別記事にて静的ABC分類をまとめています。

元ネタはみんな大好き、DAX Patternsです。

ABC分類ごとに売上を表示する

前回記事の最後に年ごとにABC分類をクラス分けされているスナップショットテーブルを作成することができました。

ABC分類別に年ごとの売上を表示するマトリクスビジュアルを作成

マトリクスビジュアルを作成すると、全て同じ売上金額が表示されてしまい、期待した数字ではありません。
これは作成した 「年」 列が、日付テーブルとリレーションの関係がなくなってしまっているのが原因です。

TREATAS関数

この状態を解消するためには、TREATAS関数を使用します。

  • 指定する列の数は、テーブル式の列数と一致するとともに、同じ順序である必要があります。

  • テーブル式で返された値が列に存在しない場合、その値は無視されます。 たとえば、TREATAS({"Red", "Green", "Yellow"}, DimProduct[Color]) では、列 DimProduct[Color] に対して、3 つの値 "Red"、"Green"、および "Yellow" を使用してフィルターが設定されます。 DimProduct[Color] に "Yellow" が存在しない場合、有効なフィルター値は "Red" と "Green" になります。

  • テーブル間にリレーションシップが存在しない場合の使用に最適です。 関連するテーブル間に複数のリレーションシップがある場合は、代わりに USERELATIONSHIP を使用することを検討してください。

ABC by Yearテーブルは、下図の項目・順番で並んでいることを確認した上で、

下記のようなDAX式を記述します。

ABC Sales Amount = 
var RemapFilterABC = 
    TREATAS(
        'ABC by Year',
        'Products'[商品ID],
        '日付テーブル'[年_yyyy年],
        'ABC by Year'[ABC Class]
    )
VAR Result =
    CALCULATE (
        [受注額],
        KEEPFILTERS ( RemapFilterABC )
    )
RETURN
    Result

このメジャーで算出した売上を使用してマトリクスビジュアルを作成すると、
期待通りの数字が出ていることが確認できます

モデリングの工夫

TREATAS関数は強力な関数である一方、概念がわかりにくいところがあります
今度は中間テーブルを作成してDAX式をよりシンプルにしていく方法を模索します。

中間テーブルの作成

先程TREATAS関数で関連付けた 「年」 の中間テーブルを作成します。
年のみを抽出したテーブルを下記のDAXで記述していきます。

新しいテーブルを作成.dax
Years = DISTINCT ( '日付テーブル'[年_yyyy年] ) 

そして、リレーションをこのように設定します。

ここまで下準備をおこなっておけば、売上を算出するDAXは下記のようにシンプルになります。

ABC Sales Amount Opt = 
CALCULATE (
    [受注額],
    'ABC by Year'
)

このDAXを使用してマトリクスビューを作成すると、こちらも期待した数値になりました。

まとめ

TREATAS関数を使ったり、モデリングの工夫でDAXをシンプルにしたりと、スナップショットABC分類を読み解くのは勉強になるなぁ
業務に応用をきかせやすい考え方なので、マスターしたい