反復子関数を使用する
反復子関数は、テーブル内の各行の式を評価します。 モデルがデータを要約する方法を柔軟に制御できます。
SUM、COUNT、MIN、MAX などの単一列の集計関数には、SUMX、COUNTX、MINX、MAXX のように、接尾辞 "X" の付いた同等の反復子関数があります。 時間の経過に伴うフィルタリング、ランキング、および半加法計算のための特殊な反復子関数も存在します。
各反復子関数には、テーブルと式が必要です。 テーブルは、モデル テーブルまたはテーブルを返す任意の式にすることができます。 式は行ごとに 1 つの値を返す必要があります。
SUM のような単一列の集計関数は、ショートカットとして機能します。 Power BI は、内部で SUM を SUMX に変換します。 たとえば、次のメジャーはどちらも同じ結果を返し、同じパフォーマンスが得られます。
Revenue = SUM(Sales[Sales Amount])
Revenue =
SUMX(
Sales,
Sales[Sales Amount]
)
反復子関数は、行コンテキストを使用してテーブル内の各行の式を評価します。つまり、一度に 1 行ずつ処理して最終結果を計算します。 その後、テーブルはフィルター コンテキストで評価されます。 たとえば、レポートのビジュアルが会計年度 FY2020 でフィルター処理される場合、Sales テーブルにはその年の売上行のみが含まれます。
重要
大きなテーブルや複雑な式で反復子関数を使用すると、パフォーマンスが低下する可能性があります。
SEARCH や LOOKUPVALUE のような関数には、コストがかかることがあります。 可能であれば、パフォーマンスを向上させるために RELATED を使用してください。
複雑な集計のための反復子関数
反復子関数を使用すると、複数の列を集計できます。 たとえば、収益メジャーでは、各行の注文数量、単価、割引率を乗算し、その結果を合計することができます。
Revenue =
SUMX(
Sales,
Sales[Order Quantity] * Sales[Unit Price] * (1 - Sales[Unit Price Discount Pct])
)
反復子関数は、関連するテーブルを参照することもできます。 割引メジャーでは、RELATED 関数を使用して製品テーブルから定価にアクセスできます。
Discount =
SUMX(
Sales,
Sales[Order Quantity]
* (
RELATED('Product'[List Price]) - Sales[Unit Price]
)
)
次の図は、Month、Revenue、Discount の列を含むテーブル ビジュアルを示しています。 Revenue と Discount は、以前に作成されたメジャーです。
高粒度の集計のための反復子関数
さらに、反復子関数は、さまざまな詳細レベル (粒度) でデータを集計することもできます。 たとえば、明細行品目レベルまたは販売注文レベルで平均を計算することがあります。
この例では、Sales テーブルには販売注文の明細行品目ごとに 1 行が含まれています。 各行には、販売注文番号、製品、販売数量、単価、割引などの詳細が含まれています。 複数の行に同じ販売注文番号が付けられ、同じ注文内の異なる品目を表すことができます。
注文明細行 (明細行品目) あたりの平均収益を計算するには、AVERAGEX 関数を使用して Sales テーブルの各行を反復処理します。 この数式は、各明細行品目の収益を計算し、現在のフィルター コンテキスト内のすべての明細行品目の結果を平均します。
Revenue Avg Order Line =
AVERAGEX(
Sales,
Sales[Order Quantity] * Sales[Unit Price] * (1 - Sales[Unit Price Discount Pct])
)
販売注文ごと (明細行品目ごとではなく) の平均収益を計算する場合は、まず VALUES 関数を使用して一意の販売注文番号のリストを取得します。 次に、AVERAGEX は各販売注文を反復処理し、各注文の合計収益を平均します。
Revenue Avg Order =
AVERAGEX(
VALUES('Sales Order'[Sales Order]),
[Revenue]
)
VALUES 関数は、現在のフィルター コンテキストに基づいて一意の販売注文を返すため、AVERAGEX は各月の各販売注文を反復処理します。
反復子関数を使用したランク付け
RANKX 関数は、テーブルを反復処理し、各行の式を評価することでランクを計算します。
順序の方向は昇順または降順になります。 売上のランキングは通常、降順で行われるため、最も大きい値が最初にランク付けされます。 苦情などのランク付けには昇順が使用されることがあり、最も小さい値が最初にランク付けされます。 既定では、RANKX は降順を使用し、同順位の場合は順位をスキップします。
たとえば、製品数量のランク付けメジャーでは、RANKX 関数と ALL 関数を使用して製品を数量でランク付けできます。
Product Quantity Rank =
RANKX(
ALL('Product'[Product]),
[Quantity]
)
ALL 関数はフィルターを削除するため、RANKX はすべての製品をランク付けします。 次の図では、2 つの製品が 10 位で同点なので、次の製品は 12 位にランク付けされ、11 位はスキップされます。
さらに、同点の場合は数字を飛ばさずに次の順位を割り当てる高密度ランキングを使用することもできます。 高密度ランキングを使用するには、メジャーに DENSE 引数を含めることができます。
Product Quantity Rank =
RANKX(
ALL('Product'[Product]),
[Quantity],
,
,
DENSE
)
ここで、2 つの製品が 10 位で同点となった後、次の製品は 11 位にランク付けされ、11 位を飛ばさずに順番に番号付けが続けられます。
このビジュアルでは、Product Quantity Rank メジャーの合計行には 1 が表示されています。これは、すべての製品の合計もランク付けされており、値が 1 つしかないためです。
合計のランク付けを回避するには、メジャーで HASONEVALUE 関数を使用して、単一の製品がフィルター処理されていない限り BLANK を返すことができます。
Product Quantity Rank =
IF(
HASONEVALUE('Product'[Product]),
RANKX(
ALL('Product'[Product]),
[Quantity],
,
,
DENSE
)
)
Product Quantity Rank の合計が空白になりました。
HASONEVALUE 関数は、フィルター コンテキストで製品列に単一の値があるかどうかを確認します。 これは各製品グループに当てはまりますが、すべての製品を表す合計には当てはまりません。
反復子関数は、Power BI モデルでデータを要約、集計、ランク付けするための強力な方法を提供します。 複雑な計算がサポートされ、レポートの詳細レベルを制御できます。