次の方法で共有


VALUES の代わりに SELECTEDVALUE を使用する

データ モデリングツールとして、列が特定の値でフィルター処理されているかどうかをテストする DAX 式を記述することが必要になる場合があります。

以前のバージョンの DAXでは、この要件は、3 つの DAX 関数を含むパターンを使用して安全に実現されました。IFHASONEVALUEVALUES。 次の指標の定義は例を示しています。 これは売上税額を計算しますが、オーストラリアの顧客に対して行われた売上に対してのみ計算されます。

Australian Sales Tax =
IF(
    HASONEVALUE(Customer[Country-Region]),
    IF(
        VALUES(Customer[Country-Region]) = "Australia",
        [Sales] * 0.10
    )
)

この例では、HASONEVALUE 関数は、現在のフィルター コンテキストで Country-Region 列の単一の値が表示されている場合にのみ、TRUE を返します。 TRUEすると、VALUES 関数はリテラル テキスト "Australia" と比較されます。 VALUES 関数が TRUEを返すと、Sales 指標に 0.10 (10%を表す) が乗算されます。 HASONEVALUE 関数が FALSEを返す場合 (複数の値が列をフィルター処理するため)、最初の IF 関数は BLANKを返します。

HASONEVALUE の使用は防御技術です。 複数の値で Country-Region 列がフィルター処理される可能性があるため、必須です。 この場合、VALUES 関数は複数の行のテーブルを返します。 複数の行のテーブルをスカラー値と比較すると、エラーが発生します。

勧告

SELECTEDVALUE 関数を使用することをお勧めします。 これは、この記事で説明されているパターンと同じ結果を実現しますが、より効率的かつエレガントです。

SELECTEDVALUE 関数を使用することで、例のメジャー定義が現在書き換えられました。

Australian Sales Tax =
IF(
    SELECTEDVALUE(Customer[Country-Region]) = "Australia",
    [Sales] * 0.10
)

ヒント

代替結果 値を SELECTEDVALUE 関数に渡すことができます。 代替結果の値は、列にフィルター (または複数のフィルター) が適用されていない場合に返されます。