はじめに
2022/01/29
PBIJP DAX Boot Camp #17 での発表内容です。
なにするの
この記事内ででてくるTREATAS
関数がよくわからないので調べてみた。
そもそもデータリネージュとは
リネージュ=血統・血筋
データの血統。テーブル間のリレーションシップがどう引き継がれているか・・ってことかな。
実験1
区分名と西暦でクロスジョインしたテーブルを作り、受注額のカラムを追加します。
EVALUATE
FILTER (
ADDCOLUMNS (
CROSSJOIN (
VALUES ( Products[区分名] ),
VALUES ( Calender[年] )
),
"Amt", [受注額]
),
[Amt] > 0
)
結果
期待した通りの値が出ています。
実験2
同じカテゴリー名を手動で定義したテーブルを作成し、売上列を追加する。
EVALUATE
VAR Categories = {
"飲料",
"調味料",
"菓子類",
"乳製品",
"穀類/シリアル",
"肉類",
"加工食品",
"魚介類"
}
RETURN
ADDCOLUMNS (
Categories,
"Amt", [受注額]
)
結果
カテゴリー名は同じものを定義していても、
データリネージュが失われているため売上金額は期待した値を集計してくれない。
実験3
列名を新たに定義しなおして、集計がどうなるか確認します。
EVALUATE
ADDCOLUMNS (
SELECTCOLUMNS (
VALUES ( Products[区分名] ),
"新しいカテゴリー名", Products[区分名]
),
"Amt", [受注額]
)
結果
列名は関係がなく、売上額は期待通り集計されています。
エンジンはデータリネージュを保持しています。
実験4
ほぼ同じDAX式ですが、区分名に &
を使用して、
hoge
を追加して新しい区分名をつくります。
EVALUATE
ADDCOLUMNS (
SELECTCOLUMNS (
VALUES ( Products[区分名] ),
"新しいカテゴリー名", Products[区分名] & "hoge"
),
"Amt", [受注額]
)
結果
集計はうまく働きません。式を使用するとデータリネージュは失われます。
TREATAS関数
Applies the result of a table expression as filters to columns from an unrelated table.
テーブル式の結果をフィルタとして、無関係なテーブルのカラムに適用する。
実験4
TREATAS
関数を使用して、自分で定義をしたCategories
の
データリネージュを変更する。
※存在しない列名は無視される。(この場合はプロテイン
列)
EVALUATE
VAR Categories = {
"飲料",
"調味料",
"菓子類",
"乳製品",
"穀類/シリアル",
"プロテイン", --元のテーブルにはない項目を追加
"肉類",
"加工食品",
"魚介類"
}
RETURN
ADDCOLUMNS (
TREATAS (
Categories,
Products[区分名]
),
"Amt", [受注額]
)
結果
データリネージュが変更され、集計が機能している。
まとめ
データリネージュとは、テーブル間のリレーションを意味している。データリネージュが維持されるときと、失われるときは正しく理解しておかないと、思わぬ集計ミスを招くこともありそうだ。
TREATAS
の使い所については別記事に。
むずい