次の2つのクエリがあります。
EVALUATE
FILTER (
SUMMARIZE (
'Sales',
Products[ProductName],
'Calendar'[CalendarYear],
"Total Sales Amount", SUM ( Sales[SalesAmount] ),
"Total Cost", SUM ( 'Sales'[TotalProductCost] )
),
Products[ProductName] = "AWC Logo Cap"
)
ORDER BY
Products[ProductName],
'Calendar'[CalendarYear] ASC
この:
EVALUATE
SUMMARIZE (
FILTER ( 'Sales', RELATED ( Products[ProductName] ) = "AWC Logo Cap" ),
Products[ProductName],
'Calendar'[CalendarYear],
"Total Sales Amount", SUM ( Sales[SalesAmount] ),
"Total Cost", SUM ( 'Sales'[TotalProductCost] )
)
ORDER BY
Products[ProductName],
'Calendar'[CalendarYear] ASC
どちらも以下を返します。
2つのクエリの唯一の違いは、FILTER関数の位置付けです。どちらがより良い方法であり、その理由は何ですか。
注意
したがって、Alexが参照する2つのsqlbi記事を見ると、パフォーマンスを向上させるために次のいずれかを実行できますが、FILTER関数が他の構文の内部または外部で発生するかどうかはまだわかりません。
EVALUATE
FILTER (
ADDCOLUMNS (
SUMMARIZE ( 'Sales', Products[ProductName], 'Calendar'[CalendarYear] ),
"Total Sales Amount", CALCULATE ( SUM ( Sales[SalesAmount] ) ),
"Total Cost", CALCULATE ( SUM ( 'Sales'[TotalProductCost] ) )
),
Products[ProductName] = "AWC Logo Cap"
)
ORDER BY
Products[ProductName],
'Calendar'[CalendarYear] ASC
そして 'SUMMARIZECOLUMNS'関数を使用します:
EVALUATE
FILTER (
SUMMARIZECOLUMNS (
Products[ProductName],
'Calendar'[CalendarYear],
"Total Sales Amount", SUM ( Sales[SalesAmount] ),
"Total Cost", SUM ( 'Sales'[TotalProductCost] )
),
Products[ProductName] = "AWC Logo Cap"
)
ORDER BY
Products[ProductName],
'Calendar'[CalendarYear] ASC
注2
SUMMARIZECOLUMNSにはFILTERパラメーターが組み込まれているようですので、これがパフォーマンスの問題を防ぐための最良の方法だと思います。
EVALUATE
SUMMARIZECOLUMNS (
Products[ProductName],
'Calendar'[CalendarYear],
FILTER ( 'Products', Products[ProductName] = "AWC Logo Cap" ),
"Total Sales Amount", SUM ( Sales[SalesAmount] ),
"Total Cost", SUM ( 'Sales'[TotalProductCost] )
)
ORDER BY
Products[ProductName],
'Calendar'[CalendarYear] ASC
あなたが与えた2つのオプションのうち、後者の方が計算的に効率的かもしれないと思います。ただし、どちらもおそらく「ベストプラクティス」ではありません。
sqlbi.comのSUMMARIZEおよびADDCOLUMNSを使用したベストプラクティス によると、
常にADDCOLUMNSバージョンを優先する必要があります。経験則では、次の条件の少なくとも1つが原因で必要とされない限り、SUMMARIZEを使用して拡張列を追加しないでください。
小計を取得するために、1つ以上のグループ化列に対してROLLUPを使用したい
この記事の後半の「SUMMARIZEおよびADDCOLUMNSのフィルターコンテキスト」セクションでわかるように、拡張列で自明でないテーブル式を使用しています。
[〜#〜] summarizecolumns [〜#〜] に関する記事も確認してください。ほとんどのユースケースで新しい関数が推奨されています。