DAX の詳細な説明: 購入推奨事項と製品 ABC 分類分析
DAX の動作評価には 3 つのステップがあります。最初にフィルターが検出され、次にフィルター関数が基になるテーブルに適用され、最後に結果が計算されます。 DAX のフィルター関数は、複雑かつ強力な関数です。たとえば、フィルター関数を使用してデータ コンテキストを操作し、動的な計算を作成できます。
01、使用量の詳細
DAX では、否定演算に NOT が使用され、OR 演算に IN が使用されますが、SQL のように NOT IN に直接隣接することはできません。以下は、DAX で IN ステートメントの前に NOT を使用する適用例です。式は次のとおりです。
M.其他收货人:=
CALCULATE (
SUM ( '运单'[数量] ),
NOT (
'收货'[收货人] IN VALUES ( '收货'[收货人])
)
)
戻り値を図 1 に示します。
■図1 NOTとINの組み合わせ応用
IN の後には、接続できる複数の列が続きます。リストは {} で構成され、各行のデータは括弧 () で構成されます。括弧 () はタプルを表し、タプルにはデータが含まれます各行のデータ。タプル内のデータはカンマで区切られます。応用例:
('装货'[包装方式], '装货'[产品]) IN {("桶装","尿素"),("箱装","蛋糕纸")}
上記の式を CALCULATE() 関数に配置して、アプリケーションのフィルタリングに参加させることもできます。
DAX で反復関数を使用する場合、行コンテキストを無視する反復集計関数によって引き起こされる合計値エラーを避けるために、最初のパラメーターのテーブルがデータ モデルの一端からのものであるか、複数の端からのものであるかに注意する必要があります。応用例、測定値 M.Total Cost 1 と M.Total Cost 2 を作成する場合、式は次のようになります。
M.总成本1:= SUMX(
'合同',
SUMX(
'运单',
'运单'[成本]*'运单'[数量]
)
)//该表达式返回的总计值有误
M.总成本2 := SUMX(
'合同',
CALCULATE(
SUMX(
'运单',
'运单'[数量]*'运单'[成本])
)
)
ピボットテーブルを作成し、契約テーブルの商品を行ラベルにドラッグし、計測値M.Totalcost1とM.Totalcost2を確認します。戻り値は図2のとおりです。
■ 図 2 モデルの一方の端での集計関数の使用
02、購入と推奨事項の分析
CALCULATE() 関数の最初のパラメータは、COUNTROWS() や SUM() などの集計関数でよく使用される値を返します。最初のパラメータは、後続の各フィルタ パラメータによって変更されたコンテキストに基づいて計算されます。テーブルにすることができます。式は次のとおりです。
M.共有产品 :=
CALCULATE (
SUM('订单'[数量]),
INTERSECT (
VALUES ( '订单'[产品] ),
VALUES ( '运单'[产品] )
)
)
最初のパラメータを除いて、他のすべてのパラメータはテーブルです。応用例、式は次のようになります。
M.共有产品B :=
CALCULATE (
SUM('运单'[数量]),
INTERSECT (
VALUES ( '订单'[产品] ),
VALUES ( '运单'[产品] )
),
INTERSECT (
VALUES ( '装货'[包装方式] ),
VALUES ( '运单'[包装方式] )
)
)
注文テーブルには合計 11 個の製品 (数量は 205) があり、運送状テーブルには合計 10 個の製品があります (不足している製品は梱包用ロープ、数量は 2)。戻り値を図 3 に示します。
CALCULATE() の 2 番目のパラメーターで、FILTER() パラメーター部分を使用して、フィルター コンテキストの範囲を拡大または縮小します。式は次のとおりです。
M.度量ZF:=
CALCULATE (
DISTINCTCOUNT ( '运单'[运单编号] ),
FILTER (
ADDCOLUMNS (
VALUES ( '运单'[运单编号] ),
"行数", COUNTROWS ( '运单' )
),
[行数] > 0
)
)
戻り値を図 4 に示します。
■ 図 4 CALCULATE() の FILTER() パラメータ
03、商品 ABC 分類分析
DAX では、ABC 分類分析は通常 3 つのステップで完了します。ステップ 1: 計算列または測定値を使用して累積値を計算します; ステップ 2: 累積値に基づいて累積比率を完成させます; ステップ 3: 比率を ABC カテゴリに分類します。測定値M.運送状体積、M.累積運送状体積、M.累積割合、M.ABC分類を作成します。式は次のとおりです。
M.运单量:=SUM('运单'[数量])
M.累计运单量 :=
VAR A = [M.运单量]
VAR B =
ADDCOLUMNS ( ALL ( '运单'[产品] ), "运量", [M.运单量] )
RETURN
IF (
HASONEVALUE ( '运单'[产品] ),
SUMX ( FILTER ( B, [运量] >= A ), [运量] )
)
M.累计占比 :=
DIVIDE (
[M.累计运单量],
CALCULATE ( [M.运单量], ALL ( '运单'[产品] ) )
)
M.ABC分类 :=
IF (
HASONEVALUE ( '运单'[产品] ),
SWITCH (
TRUE (),
[M.累计占比] <= 0.7, "A",
[M.累计占比] <= 0.9, "B",
"C"
)
)
ピボットテーブルを作成し、運送状テーブル内の商品を行エリアにドラッグし、M.運送状数量、M.累積運送状数量、M.累積割合、M.ABC分類の測定値を確認します。戻り値を図 5 に示します。
■図5 製品のABC分類分析
04、商品の開封と残高の分析
DK テーブルに計算列ライブラリを作成します。年と月の式は次のとおりです。
库.年月:= YEAR('DK'[日期])*100+MONTH('DK'[日期])
残高分析の基本原則は、前期間の終わりが現在の期間の始まりに等しいということです。測定値の作成 M.入数量、M.出数量、M.開始数量、M.残高数量 式は次のとおりです。
M.入库量:= SUM(DK[入库])
M.出库量:= SUM(DK[出库])
M.期初量:=
CALCULATE (
[M.入库量] - [M.出库量],
FILTER (
ALL ('DK'[库.年月] ),
'DK'[库.年月] < MIN ( 'DK'[库.年月] )
)
)
M.结存量:= [M.期初量]+[M.入库量]-[M.出库量]
ピボットテーブルを作成し、ライブラリ、年、月を行ラベルにドラッグし、測定値M.開始数量、M.入荷数量、M.出荷数量、M.残高数量を確認します。戻り値を図 6 に示します。
■図6 入出庫倉庫の始期・残高分析