【保存版】1日1DAX DAY31~DAY40:Power BI初心者のためのDAX入門まとめ

こんにちは、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(‘売上'[金額])

                         )

■ポイントまとめ:

  • 複数列でグループ化できる (例:年月 × 商品コード)
  • グループ単位で売上や件数を集計する
  • ADDCOLUMNSSELECTCOLUMNS より複雑な集計の基礎として使う

■注意点

  • SUMMARIZE自動で計算コンテキストを作らないため、CALCULATE と併用するケースが多い
  • モデルが複雑な場合や、関係のないテーブルで使うと期待通りに動かないこともあるため注意

DAY34: SUMMARIZECOLUMNS

実務で超使える!集計テーブル作成の決定版!!

<テーブル操作関数>

グループ化された集計テーブルを作る最も推奨される方法の一つです。SUMMARIZE に比べて より安定・効率的で、フィルターコンテキストも自動で引き継がれます。

DAX: SUMMARIZECOLUMNS(
    グループ化する列1,
    グループ化する列2, …
    [フィルター],
    ”新しい列名1″, 式1,
    ”新しい列名2″, 式2,
     …
    )

使用例:「売上」テーブルから「地域コード」別「売上合計」を出す

地域別売上合計 =SUMMARIZECOLUMNS(

    ‘売上'[地域コード],

    “売上合計”, SUM(‘売上'[金額])

)

■ポイントまとめ:

  • SUM,COUNT,AVERAGEなどの集計対応する
  • ビジュアルやスライサーの条件も反映される
  • 複数テーブルに対応しやすい

SUMMARIZECOLUMNS vs SUMMARIZE

比較点SUMMARIZESUMMARIZECOLUMNS
フィルター継承手動で指定が必要自動継承
エラーの出やすさ時々エラーになるより安定
パフォーマンス複雑だと遅いことがある最適化されている
おすすめ度サポートあり 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の中でフィルターを「上書きしない」
  • 複数の条件を“共存”させたいときに便利
  • SUMMARIZECOLUMNSCALCULATETABLE 内で使って 正確な行数・件数を取りたいとき

DAY38: ALLSELECTED

選ばれている中での“全体”が知りたい!

スライサーやビジュアルで選択された範囲は保持しつつ、テーブル全体の中で集計を行いたいとき」に使う関数です

言い換えると、「ユーザーが選んだ範囲内での全体」を知りたいときに使います

DAX:ALLSELECTED(テーブル名 または 列名)

使用例:選択範囲の中での割合を計算する

構成比(地域内) =

 DIVIDE(

  SUM(‘売上'[売上金額]),

  CALCULATE( SUM(‘売上'[売上金額]), ALLSELECTED(‘売上'[地域]))

)

➡ スライサーで選ばれた範囲内の「全体売上」に対する割合を出せます。

ALLALLSELECTED の違い(超重要)

関数フィルターの影響
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式になれましたか?

今回は少し難しい「テーブル操作関数」が多かったですが、名前は似ているか用途が違うのでこの際に理解して活用してください!!

自己紹介
この記事を作成した人
PowerBI女子

外資ITコンサルのデータアナリスト10年目です。
Power BIで業務効率化をお手伝いしています
MS認定資格:Fabric Analytics Engineer/Power BI Data Analyst

PowerBI女子をフォローする
DAX
PowerBI女子をフォローする

コメント

タイトルとURLをコピーしました