0

次の 2 つのクエリを使用して、舞台裏で何が起こっているのかを正確に説明できる人はいますか? それらは同じ結果を示しているように見えますが、多対多の関係で表形式モデル dax のメジャーをフィルター処理する場合はどちらが「より良い」でしょうか...

これが (かなり標準的な) モデルです: FactData ---> Account <--- AccountCustomerM2M ---> Customer

例 1:

SumAmountM2M - v1 :=
IF (
    COUNTROWS ( ALL ( Customers ) ) > 0,
    CALCULATE ( SUM ( 'FactData'[Amount] ), AccountCustomerM2M ),
    SUM ( 'FactData'[Amount] )
)

例 2:

SumAmountM2M - v2 :=
IF (
    ISCROSSFILTERED ( 'Customers'[CustomerKey] ),
    CALCULATE ( SUM ( 'FactData'[Amount] ), AccountCustomerM2M ),
    SUM ( 'FactData'[Amount] )
)

ご協力いただきありがとうございます!:)

4

1 に答える 1

2

例 1 では、Customers テーブルが空でない限り、Customers の選択に関係なく、常に多対多の計算を使用しています。IF ( COUNTROWS ( ALL ( Customers ) ) > COUNTROWS ( Customers ), ... と書きたいと思うかもしれません。

例 2 では、顧客を直接または間接的に選択した場合にのみ、多対多の計算を実行します (たとえば、スライサーで顧客の都市を選択した場合)。

例 2 では、ISCROSSFILTERED 関数がクエリ プランで 1 回だけ実行され、COUNTROWS アプローチよりも最適化されているため、計算を最適化します。複雑な反復では、外部反復のすべての行コンテキストで実行されるため、よりコストがかかる可能性があります。

マルコ

于 2014-11-04T17:28:13.187 に答える