よく使われるDAX式のサンプルです。時々更新します。
なお、ページ数は私の著作『Excelパワーピボット』のでの参照ページです。
[P194] 売上合計
=
SUM('F_売上明細'[売上])
[P197] 平均単価(割り算を行うときはDivide By ZeroエラーはNULLに)
=
DIVIDE([売上合計],[販売数量合計])
[P218] 商品売上総計(テーブル単位でのフィルター解除)
=
CALCULATE(
[売上合計],
ALLSELECTED('商品')
)
[P228] 商品カテゴリー売上小計(テーブルの列単位でのフィルター解除)
=
CALCULATE(
[売上合計],
ALLSELECTED('商品'[商品名])
)
[P233] 商品カテゴリー選択(現在当たっているフィルターを検知)
=
ISFILTERED('商品'[商品カテゴリー])
[P235] 商品割合(ドリルダウンのレベルごとにメジャーの表示を切り替える)
=
IF(
ISFILTERED('商品'[商品名])=TRUE, [商品売上小計割合],
[商品カテゴリー割合]
)
累計売上(FILTER関数)
=
CALCULATE (
[売上合計],
FILTER (
ALL('カレンダー'),
'カレンダー'[日付] <= MAX('カレンダー'[日付])
)
)
[P254] 当期累計売上①詳細パターン
=
CALCULATE (
[売上合計],
FILTER (
ALL('カレンダー'),
'カレンダー'[日付] <= MAX('カレンダー'[日付])
&& 'カレンダー'[会計年度] = MAX('カレンダー'[会計年度])
)
)
当期累計売上(FILTER関数&VAR)
=
VAR DateFilter
=
FILTER (
ALL('カレンダー'),
'カレンダー'[日付] <= MAX('カレンダー'[日付])
&& 'カレンダー'[会計年度] = MAX('カレンダー'[会計年度])
)
RETURN
CALCULATE (
[売上合計],
DateFilter
)
[P256] 当期売上累計②タイムインテリジェンス関数
=
CALCULATE(
[売上合計],
DATESYTD('カレンダー'[日付], "3/31")
)
=
CALCULATE(
[売上合計],
DATESQTD('カレンダー'[日付])
)
=
CALCULATE(
[売上合計],
DATESMTD('カレンダー'[日付])
)
[P263] 前年度売上合計(SAMEPERIODLASTYEAR)
=
CALCULATE(
[売上合計],
SAMEPERIODLASTYEAR('カレンダー'[日付])
)
前年度売上(FILTER関数&VAR&ISFILTERED&IF)
[売上合計_前年_年]
=VAR DateFilter
=
FILTER (
ALL('カレンダー'),
'カレンダー'[会計年度] = MAX('カレンダー'[会計年度]) -1
)
RETURN
CALCULATE (
[売上合計],
DateFilter
)
[売上合計_前年_Qtr]
=VAR DateFilter
=
FILTER (
ALL('カレンダー'),
'カレンダー'[会計年度] = MAX('カレンダー'[会計年度]) -1 &&
'カレンダー'[Qtr] = MAX('カレンダー'[Qtr])
)
RETURN
CALCULATE (
[売上合計],
DateFilter
)
[売上合計_前年_月]
=VAR DateFilter
=
FILTER (
ALL('カレンダー'),
'カレンダー'[会計年度] = MAX('カレンダー'[会計年度]) -1 &&
'カレンダー'[月] = MAX('カレンダー'[月])
)
RETURN
CALCULATE (
[売上合計],
DateFilter
)
[売上合計_前年_日付]
=VAR DateFilter
=
FILTER (
ALL('カレンダー'),
'カレンダー'[会計年度] = MAX('カレンダー'[会計年度]) -1 &&
'カレンダー'[YTD] = MAX('カレンダー'[YTD])
)
RETURN
CALCULATE (
[売上合計],
DateFilter
)
[売上合計_前年]
=
IF (
ISFILTERED ( 'カレンダー'[日付] ) = TRUE,
[売上合計_前年_日付],
IF (
ISFILTERED ( 'カレンダー'[月] ) = TRUE,
[売上合計_前年_月],
IF (
ISFILTERED ( 'カレンダー'[会計四半期] ) = TRUE,
[売上合計_前年_Qtr],
IF (
ISFILTERED ( 'カレンダー'[会計年度] ) = TRUE,
[売上合計_前年_年],
BLANK ()
)
)
)
)
[P263] 前年度売上累計(DATESYTDをSAMEPERIODLASTYEARで囲む)
=
CALCULATE(
[売上合計],
SAMEPERIODLASTYEAR(
DATESYTD('カレンダー'[日付],"3/31")
)
)
3カ月移動平均 DATESINPERIODを使用
=
CALCULATE (
[売上合計],
DATESINPERIOD ( 'カレンダー'[日付], MAX ( 'カレンダー'[日付] ), -3, MONTH )
)
ランキング(ALLと組み合わせて使用する)
=
RANKX(
ALLSELECTED('商品'), [売上合計]
)
=
IF(
[売上合計],
RANKX(
ALLSELECTED('支店'), [売上合計]
)
)
値表示( VALUES は列の値を列挙するが、1行のみのときスカラーになる)
COUNTROWSによるパターン
=
IF (
COUNTROWS ( VALUES ( 'P_集計タイプ'[集計タイプ] ) ) = 1,
VALUES ( 'P_集計タイプ'[集計タイプ] )
)
HASONEVALUEによるパターン
=
IF (
HASONEVALUE ( 'P_集計タイプ'[集計タイプ] ),
VALUES ( 'P_集計タイプ'[集計タイプ] )
)
Power BIのみ
= SELECTEDVALUE('P_集計タイプ'[集計タイプ] )
スライサーとパラメーターテーブルによる選択
リレーションシップを持たない分類だけのテーブルを作り、スライサー経由でフィルターコンテキストを渡して、表示するメジャーを切り替える
COUNTROWSによるパターン
=
IF (
COUNTROWS ( VALUES ( 'P_集計タイプ'[集計タイプ] ) ) = 1,
SWITCH (
VALUES ( 'P_集計タイプ'[集計タイプ] ),
"売上", [売上合計],
"原価", [売上合計] - [利益合計],
"利益", [利益合計]
)
)
HASONEVALUEによるパターン
=
IF (
HASONEVALUE ( 'P_集計タイプ'[集計タイプ] ),
SWITCH (
VALUES ( 'P_集計タイプ'[集計タイプ] ),
"売上", [売上合計],
"原価", [売上合計] - [利益合計],
"利益", [利益合計]
)
)
Power BIのみ
=
SWITCH (
SELECTEDVALUE('P_集計タイプ'[集計タイプ] ),
"売上", [売上合計],
"原価", [売上合計] - [利益合計],
"利益", [利益合計]
)
セグメンテーション(値を元にAランク、Bランクというように分類)
区分化テーブルにリレーションシップは作らず、不等号によるレンジでセグメントを返す。
メジャー1レベル
Grade =
CALCULATE(
VALUES( '区分化テーブル'[Rank] ),
FILTER( '区分化テーブル', '区分化テーブル'[Start] < [売上合計] && [売上合計] < '区分化テーブル'[End] )
)
メジャー2レベル
Grade_2 =
VAR PRODUCT_CATEGORY = SELECTEDVALUE('商品'[商品カテゴリー])
RETURN
CALCULATE (
VALUES ( '区分化テーブル'[Rank] ),
FILTER ( '区分化テーブル', '区分化テーブル'[Start] < [売上合計] && [売上合計] < '区分化テーブル'[End] ),
FILTER ( '区分化テーブル', '区分化テーブル'[Category] = PRODUCT_CATEGORY )
)
デバッグ式
タイムインテリジェンス関数(シリアル値による最大・最小)
=
// カレンダー
VAR DateFilter = SAMEPERIODLASTYEAR('カレンダー'[日付])
// Date Range
VAR MaxDate = FORMAT(CALCULATE(MAX('カレンダー'[日付]), DateFilter), "YYYY/MM/DD")
VAR MinDate = FORMAT(CALCULATE(MIN('カレンダー'[日付]), DateFilter), "YYYY/MM/DD")
VAR CountDates = COUNTROWS(DateFilter)
RETURN
MinDate & " - " & MaxDate & " (" & CountDates & ")"
FILTER関数(シリアル値による最大・最小)
=
// カレンダー
VAR DateFilter
= FILTER(
ALL('カレンダー'),
'カレンダー'[日付] <= MAX('カレンダー'[日付]) &&
'カレンダー'[会計年度] = MAX('カレンダー'[会計年度])
)
// Date Range
VAR MaxDate = FORMAT(CALCULATE(MAX('カレンダー'[日付]), DateFilter), "YYYY/MM/DD")
VAR MinDate = FORMAT(CALCULATE(MIN('カレンダー'[日付]), DateFilter), "YYYY/MM/DD")
VAR CountDates = COUNTROWS(DateFilter)
RETURN
MinDate & " - " & MaxDate & " (" & CountDates & ")"
テキスト値(最大・最小を持たないので列挙する)
=
CONCATENATEX('商品', '商品'[商品名] , " / ")
メジャーによるカテゴリー別累積計算テーブル(以下リンクを参考にしたものです)
ABC dynamic classification – DAX Patterns
テーブル(Power BIのみ)
=
ADDCOLUMNS(
-- レベル1:商品ID、売上合計
ADDCOLUMNS( VALUES( '商品'[商品ID] ), "商品ごと売上", [売上合計] ),
-- レベル1:追加項目
"順位", COUNTROWS(
-- サブテーブルの作成
FILTER(
-- レベル2:商品ID、売上合計
ADDCOLUMNS( VALUES( '商品'[商品ID] ), "サブ商品ごと売上", [売上合計] ),
-- 外側の1行1行に対して内側の方が大きいものに絞る
[サブ商品ごと売上] >= [商品ごと売上]
)
),
-- レベル1:追加項目
"累積", -- 上位からの合計
SUMX(
-- サブテーブルの作成
FILTER(
-- レベル2:商品ID、売上合計
ADDCOLUMNS( VALUES( '商品'[商品ID] ), "サブ商品ごと売上", [売上合計] ),
-- 外側の1行1行に対して内側の方が大きいものに絞る
[サブ商品ごと売上] >= [商品ごと売上]
),
-- サブテーブルの売上を合計
[サブ商品ごと売上]
),
-- レベル1:追加項目
"商品売上 Total", CALCULATE( [売上合計], VALUES( '商品'[商品ID] ) ),
-- レベル1:追加項目
"累積割合", -- 上位からの合計
DIVIDE(
SUMX(
-- サブテーブルの作成
FILTER(
-- レベル2:商品ID、売上合計
ADDCOLUMNS( VALUES( '商品'[商品ID] ), "サブ商品ごと売上", [売上合計] ),
-- 外側の1行1行に対して内側の方が大きいものに絞る
[サブ商品ごと売上] >= [商品ごと売上]
),
-- サブテーブルの売上を合計
[サブ商品ごと売上]
),
CALCULATE( [売上合計], VALUES( '商品'[商品ID] ) )
)
)
メジャーによるABC分析(以下リンクを参考にしたものです)
ABC dynamic classification – DAX Patterns
売上合計 ABC =
CALCULATE(
[売上合計],
VALUES( '商品'[商品ID] ),
-- 商品IDごとのA,B,Cに限定
FILTER(
CALCULATETABLE(
ADDCOLUMNS(
-- レベル1:商品ID、売上合計
ADDCOLUMNS(
VALUES( '商品'[商品ID] ),
"商品ごと売上", [売上合計]
),
-- レベル1:追加項目
"累積割合", -- 上位からの合計
DIVIDE(
SUMX(
-- サブテーブルの作成
FILTER(
-- レベル2:商品ID、売上合計
ADDCOLUMNS(
VALUES( '商品'[商品ID] ),
"サブ商品ごと売上", [売上合計]
),
-- 外側の1行1行に対して内側の方が大きいものに絞る
[サブ商品ごと売上] >= [商品ごと売上]
),
-- サブテーブルの売上を合計
[サブ商品ごと売上]
),
CALCULATE(
[売上合計],
VALUES( '商品'[商品ID] )
)
)
),
-- 商品テーブルのフィルターを解除
ALL( '商品' )
),
-- FILTERでレンジを限定
[累積割合] > [区分下限値]
&& [累積割合] <= [区分上限値]
)
)
ある月に売上のない顧客ID(計算テーブル)
顧客ID売上無し =
FILTER (
ADDCOLUMNS (
VALUES ( 'F_売上明細'[顧客ID] ),
"前回の売上",
CALCULATE (
COUNTROWS ( 'F_売上明細' ),
(
FILTER (
ALL ( 'カレンダー' ),
'カレンダー'[月] = 9
)
)
)
),
[前回の売上] = 0
)
売上無し顧客名(リレーションシップ経由)
顧客名売上無し =
FILTER (
ADDCOLUMNS (
// VALUES ( 'F_売上明細'[顧客ID] ),
VALUES ( 'D_顧客'[顧客名] ),
"前回の売上",
CALCULATE (
COUNTROWS ( 'F_売上明細' ),
(
FILTER (
ALL ( 'カレンダー' ),
'カレンダー'[月] = 9
)
)
)
),
[前回の売上] = 0
)
新規顧客数(メジャー)
新規顧客数 =
COUNTROWS (
FILTER (
ADDCOLUMNS (
VALUES ( 'F_売上明細'[顧客ID] ),
"前回の売上",
CALCULATE (
COUNTROWS ( 'F_売上明細' ),
(
FILTER (
ALL ( 'カレンダー' ),
'カレンダー'[日付] < MIN( 'カレンダー'[日付])
)
)
)
),
[前回の売上] = 0
)
)
新規顧客数(前年売上無し)
新規顧客数(前年売上無し) =
COUNTROWS (
FILTER (
ADDCOLUMNS (
VALUES ( 'F_売上明細'[顧客ID] ),
"前回の売上",
CALCULATE (
COUNTROWS ( 'F_売上明細' ),
(
FILTER (
ALL ( 'カレンダー' ),
'カレンダー'[会計年度] = SELECTEDVALUE('カレンダー'[会計年度]) -1
)
)
)
),
[前回の売上] = 0
)
)
Many to Many の集計
TREATAS_売上 = CALCULATE(
[売上合計],
TREATAS( VALUES('P_顧客と支店の組み合わせ'[支店]), 'D_支店'[支店名]),
TREATAS( VALUES('P_顧客と支店の組み合わせ'[顧客]), 'D_顧客'[顧客ID])
)