こんにちは、Power BI女子です!
毎日1つずつDAX関数を紹介する「#1日1DAX」チャレンジ、今回はDAY31〜DAY40までの内容をまとめました。
今回は<テーブル操作関数>が多いです。
このシリーズが、みなさんのPower BIライフの「ひとくちDAX習慣」になれたらうれしいです。
DAY31: ADDCOLUMNS
テーブルに“列”を追加する関数!
<テーブル操作関数>
指定したテーブルに、カスタム列を追加する関数です
DAX:ADDCOLUMNS(テーブル,
”列名”, 式,
”列名2″, 式2, …)
※使用例で使う「売上」テーブル

使用例:「売上」テーブルに商品別売上の「消費税」、「税込金額」列を追加して新しいテーブルを作成する
商品別売上_税込 =
ADDCOLUMNS(
‘売上’,
“消費税”, ‘売上'[金額] * 0.1,
“税込金額”, ‘売上'[金額] * 1.1
)


■ポイントまとめ:
- 元のテーブルを変更するのではなく、新しいテーブルを作成する
- SUMMARIZE や FILTER と組み合わせて「集計+列追加」もOK!
- CALCULATE と併用で動的な列追加も可能!
DAY32: SELECTCOLUMNS
列を”選んで”新しいテーブルを作る関数!
<テーブル操作関数>
既存テーブルの指定した列だけを抜き出して、新しいテーブルを作れます
データをシンプルにしたいとき、ピボットや集計前の整形にも便利です
DAX:SELECTCOLUMNS(
テーブル名,
”新しい列名1″, 列または式1,
”新しい列名2″, 列または式2,
…
)
使用例: 「売上」テーブルから「商品コード」別「売上合計」だけ抽出する
商品別売上 = SELECTCOLUMNS(‘売上’,
“商品”,’売上'[商品コード],
“売上”,’売上'[金額]
)


■ポイントまとめ:
- 必要な列を指定して、対象列だけを抜けたい場合使用する
- 集計(SUM,GROUP BY)はできない
DAY33: SUMMARIZE
テーブルをグループ化・集計の関数だよ
<テーブル操作関数>
テーブルを指定した列でグループ化して、 その上で合計・平均などの集計列も追加できる超便利関数です
DAX:SUMMARIZE(
テーブル名,
グループ化する列1,
グループ化する列2, …
[ “新しい列名1”, 式1 ],
[ “新しい列名2”, 式2 ], …
)
使用例:「売上」テーブルから「商品コード」別「売上合計」を出す
商品別売上合計= SUMMARIZE(‘売上’,
[商品コード],
“売上合計”,SUM(‘売上'[金額])
)


■ポイントまとめ:
- 複数列でグループ化できる (例:年月 × 商品コード)
- グループ単位で売上や件数を集計する
ADDCOLUMNS
やSELECTCOLUMNS
より複雑な集計の基礎として使う
■注意点
SUMMARIZE
は自動で計算コンテキストを作らないため、CALCULATE
と併用するケースが多い- モデルが複雑な場合や、関係のないテーブルで使うと期待通りに動かないこともあるため注意
DAY34: SUMMARIZECOLUMNS
実務で超使える!集計テーブル作成の決定版!!
<テーブル操作関数>
グループ化された集計テーブルを作る最も推奨される方法の一つです。SUMMARIZE
に比べて より安定・効率的で、フィルターコンテキストも自動で引き継がれます。
DAX: SUMMARIZECOLUMNS(
グループ化する列1,
グループ化する列2, …
[フィルター],
”新しい列名1″, 式1,
”新しい列名2″, 式2,
…
)
使用例:「売上」テーブルから「地域コード」別「売上合計」を出す
地域別売上合計 =SUMMARIZECOLUMNS(
‘売上'[地域コード],
“売上合計”, SUM(‘売上'[金額])
)


■ポイントまとめ:
- SUM,COUNT,AVERAGEなどの集計対応する
- ビジュアルやスライサーの条件も反映される
- 複数テーブルに対応しやすい
■SUMMARIZECOLUMNS
vs SUMMARIZE
比較点 | SUMMARIZE | SUMMARIZECOLUMNS |
---|---|---|
フィルター継承 | 手動で指定が必要 | 自動継承 |
エラーの出やすさ | 時々エラーになる | より安定 |
パフォーマンス | 複雑だと遅いことがある | 最適化されている |
おすすめ度 | サポートあり | Microsoft推奨 |
DAY35: CALCULATETABLE
条件付きでテーブル抽出する関数!
<フィルター関数>
テーブルに対してフィルターをかけたり、集計コンテキストを操作する関数です
実際には CALCULATE
のテーブル版と考えるとわかりやすいです
DAX:CALCULATETABLE(
テーブル式,
フィルター式1,
フィルター式2, …
)
使用例:「売上」テーブルから金額が300以上のみ抽出する
売上_300 = CALCULATETABLE(
’売上’,
’売上'[金額]>= 300
)


■ポイントまとめ:
CALCULATE
のテーブル版でテーブル単位でフィルター制御する- 動的に再構成できるので仮想テーブル作成に便利
- ビジュアルのスライサー影響も操作可能
■よくある組み合わせ
関数 | 用途 |
---|---|
SUMMARIZECOLUMNS | 集計結果にフィルターをかけたい時に中で使う |
FILTER | フィルター式が複雑な場合に分けて使う |
SELECTCOLUMNS | 必要な列だけ抽出する |
ALL , ALLEXCEPT , REMOVEFILTERS | フィルターの解除/変更と組み合わせる |
DAY36: REMOVEFILTER
フィルター、全部消しちゃお!
<フィルター関数>
「特定の列やテーブルのフィルターを解除する」ために使います
DAX:REMOVEFILTERS(列名またはテーブル名)
使用例:全地域売上の合計を出す
全地域売上=
CALCULATE(
SUM(‘売上'[金額]),
REMOVEFILTERS(‘売上'[地域])
)

➡ スライサーやフィルターで選ばれている地域の条件を無視して、全地域の合計売上を返します
■ポイントまとめ:
- スライサーやビジュアルの影響を完全に無視できる
- 「全体平均」「全体売上」などの表示に便利
- 前年比や全体比の計算時(ベースラインの値を取る)使用する
- KPI計算で「全体に対する割合」を出したいとき使用する
DAY37: KEEPFILTERS
フィルターは壊さず、そっと追加!
「既存のフィルターコンテキストを保持したまま、新しいフィルターを追加する」ために使われます
DAX:CALCULATE(
式,
KEEPFILTERS(フィルター式)
)
使用例 :ビジュアルで「地域=札幌」が選ばれているとき、 さらに「カテゴリ=食品」の売上だけ出したい!
食品売上_スライサー維持 = CALCULATE(
SUM(‘売上'[売上金額]),
KEEPFILTERS(‘売上'[商品カテゴリ] = “食品”)
)

➡ 元々かかっていたフィルター(地域)を壊さずに、「食品」カテゴリの条件だけを追加します
■KEEPFILTERS
の重要な違い(上書き vs 追加)
書き方 | 結果 |
---|---|
CALCULATE(…, '売上'[カテゴリ] = "食品") | 既存のカテゴリ条件を上書き |
CALCULATE(…, KEEPFILTERS('売上'[カテゴリ] = "食品")) | 元のフィルターに追加 |
■ポイントまとめ:
- CALCULATEの中でフィルターを「上書きしない」
- 複数の条件を“共存”させたいときに便利
SUMMARIZECOLUMNS
やCALCULATETABLE
内で使って 正確な行数・件数を取りたいとき
DAY38: ALLSELECTED
選ばれている中での“全体”が知りたい!
「スライサーやビジュアルで選択された範囲は保持しつつ、テーブル全体の中で集計を行いたいとき」に使う関数です
言い換えると、「ユーザーが選んだ範囲内での全体」を知りたいときに使います
DAX:ALLSELECTED(テーブル名 または 列名)
使用例:選択範囲の中での割合を計算する
構成比(地域内) =
DIVIDE(
SUM(‘売上'[売上金額]),
CALCULATE( SUM(‘売上'[売上金額]), ALLSELECTED(‘売上'[地域]))
)
➡ スライサーで選ばれた範囲内の「全体売上」に対する割合を出せます。

■ALL
と ALLSELECTED
の違い(超重要)
関数 | フィルターの影響 |
---|---|
ALL | スライサーやビジュアルのフィルターをすべて解除 |
ALLSELECTED | ユーザーが選択したスライサーやビジュアルの範囲は保持 |
■比較イメージ
スライサー選択 | ALL() の結果 | ALLSELECTED() の結果 |
---|---|---|
東京・大阪選択 | 日本全国が対象 | 東京・大阪が対象 |
■ポイントまとめ:
- スライサーやビジュアルの選択範囲を尊重して使える
- 「全部」ではなく、「今見てる中での全体」を定義
- 構成比やランキング計算に最適!
DAY39: UNION
同じ形のテーブルを、上下にガッチャンコ!
<テーブル操作関数>
複数のテーブルを縦に結合(行方向に追加) したいときに使う関数です
QLの UNION
と似ていますが、DAXでは 列数・列名・型の一致が必要です
DAX:UNION(テーブル1, テーブル2)
- 2つ以上のテーブルを連結可能
- 列の構成(数・名前・データ型)が一致していないとエラーになる
使用例:2つの売上テーブルを縦に結合する
売上 = UNION(‘売上_2024′,’売上_2025’)

■ポイントまとめ:
- 複数のテーブルを「行方向」で連結できる
- 集計前のデータ準備や比較に便利
- 重複行は削除されない
■重複を除きたいとき
UNION結果 = DISTINCT(UNION(テーブル1, テーブル2))
DAY40: INTERSECT / EXCEPT
二つのテーブルの共通部分と差分をチェックするとき!
2つのテーブルの共通部分 または 差分 を抽出したいときに使う関数です
DAX:
- INTERSECT(テーブル1, テーブル2)
- EXCEPT(テーブル1, テーブル2)
使用例①:INTERSECT(共通する顧客)
共通顧客 =INTERSECT(‘顧客A’,’顧客上B’)
使用例②:EXCEPT(Aにしかない顧客)
差分顧客 =EXCEPT(‘顧客A’,’顧客B’)

→共通顧客:商品Aと商品Bの中で、共通して存在する商品だけが出てくる!
→差分顧客:商品Aにはあるけど、商品Bには存在しないものだけを出せる!
■ポイントまとめ:
- INTERSECT → 共通する行だけを取り出す(A ∩ B)
- EXCEPT → 差分だけを取り出す(A − B)
- 両方「同じ列構成」が条件!
UNION
,INTERSECT
,EXCEPT
を組み合わせて、分類・差分チェックが可能。
■比較
関数 | 意味 | 戻り値 | 用途 |
---|---|---|---|
INTERSECT | 共通部分 | 両方に存在する行 | クロスチェック、共通の顧客など |
EXCEPT | 差分 | 一方にしかない行 | 例:未対応・未購入データ抽出 |
これで40日まで「#1日1DAX」が終わりました!📊💛
少しDAX式になれましたか?
今回は少し難しい「テーブル操作関数」が多かったですが、名前は似ているか用途が違うのでこの際に理解して活用してください!!
コメント