web-dev-qa-db-ja.com

SUMMARIZEの内部または外部でFILTERを使用する必要がありますか?

次の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

どちらも以下を返します。

enter image description here

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
6
whytheq

あなたが与えた2つのオプションのうち、後者の方が計算的に効率的かもしれないと思います。ただし、どちらもおそらく「ベストプラクティス」ではありません。

sqlbi.comのSUMMARIZEおよびADDCOLUMNSを使用したベストプラクティス によると、

常にADDCOLUMNSバージョンを優先する必要があります。経験則では、次の条件の少なくとも1つが原因で必要とされない限り、SUMMARIZEを使用して拡張列を追加しないでください。

  • 小計を取得するために、1つ以上のグループ化列に対してROLLUPを使用したい

  • この記事の後半の「SUMMARIZEおよびADDCOLUMNSのフィルターコンテキスト」セクションでわかるように、拡張列で自明でないテーブル式を使用しています。

[〜#〜] summarizecolumns [〜#〜] に関する記事も確認してください。ほとんどのユースケースで新しい関数が推奨されています。

6
Alexis Olson