「列を揃えて結合したい」「マスタ情報を付けたい」「不一致データを洗い出したい」——Power Query を使えば、power bi クエリのマージでほとんどの“結合”仕事が片づきます。
本記事は、分かりやすさ最優先で、操作の基本、結合タイプの使い分け、多キー・ファジー結合、列の展開、そして実務でハマりがちな落とし穴と最適化のコツを手順ベースで整理しました。サンプルの M コードもそのまま流用できます。
超要約(最初の3分)
-
power bi クエリのマージは、Power Query(Desktop の Power Query エディター)で行う“テーブルどうしの結合”。
-
結合タイプは使い分けが命:LeftOuter(左外部)、Inner(内部)、Right/Full、LeftAnti/RightAnti(不一致抽出)、Fuzzy(あいまい)。
-
型合わせ・トリミング・大文字小文字統一が成功率を左右。複数キー結合で安定させる。
-
高速化は 上流で絞る→折りたたみ維持→不要列削除→キー単純化 が基本。
-
不一致検出・重複膨張・多対多の扱いが“実務の山場”。アンチ結合と集約でコントロール。
1. 基本を一枚で理解:マージとアペンドの違い
-
マージ(Merge):共通キー(例:
ProductID
)で列を横にくっつける。= SQL のJOIN
。 -
アペンド(Append):同じ列構造のテーブルを縦につなげる。= SQL の
UNION ALL
。
マスタ付け、属性付与、不一致チェックはpower bi クエリのマージの領域です。
2. 手順:標準的な「マスタ付け」5ステップ
目的:Sales
(売上明細)に Products
(商品マスタ)の商品名とカテゴリを付与(左外部結合)。
-
Power Query エディターで
Sales
を選択 -
ホーム > マージクエリ(Merge Queries)(既存に結合)または マージクエリ(新規作成) を選ぶ
-
上段に
Sales
、下段にProducts
を指定 -
両テーブルでキー列(例:
ProductID
)をクリックして選択(複数キーは Ctrl/⌘ で順番どおりに) -
結合の種類を 左外部(Left Outer) にして OK → 追加された“ネストされた列”を 展開して、必要列(
ProductName
,Category
)だけ選んで確定
コツ:power bi クエリのマージ直前に、キー列が同じデータ型(テキスト/整数/日付)であることを確認。型が違うと一致しません。
3. 結合タイプの使い分け(7種類)
-
Left Outer(左外部):左の全行+一致した右の列(いちばん使用頻度が高い)
-
Inner(内部):左右とも一致した行だけ(突合結果の“共通部分”)
-
Right Outer(右外部):右の全行+一致した左の列(右が主のとき)
-
Full Outer(完全外部):一致/不一致を含む全件(差分調査に)
-
Left Anti(左アンチ):左にしかない行(=右に未登録の項目の抽出)
-
Right Anti(右アンチ):右にしかない行
-
Fuzzy(あいまい):スペルゆらぎや表記差を許容して一致判定(製品名・社名などの表記ブレ対策)
実務で光るのは Left Anti(未登録・不一致検出)と Full Outer(差分棚卸)。power bi クエリのマージは照合作業の強力なレンズになります。
4. 多キー結合(複数列)で安定させる
単一キーだと重複や偶発一致に弱くなります。店舗×日付×商品など、論理的に一意になる組み合わせをキーにしましょう。
選択は 左→右テーブルで同じ順序。順番がずれると別キー扱いになります。
5. 列の展開と命名のルール
マージ後は右テーブルがネストされたテーブル列として1列追加されます。右端の 展開ボタン(↔) で必要な列だけを展開し、わかる名前にリネーム。
例)Products.ProductName
→ 商品名
、Products.Category
→ カテゴリ
。
後工程(モデリングや DAX)で迷わないよう、power bi クエリのマージの時点で命名を整えておくと吉。
6. ありがちな“ハマりどころ”と処方箋
6-1. 合致しない(NULLばかり)
-
型が違う(数字 vs テキスト、日時 vs 日付)→ 型を合わせる
-
前後スペース・不可視文字 →
Text.Trim
,Text.Clean
相当の整形 -
大文字小文字・全角半角 →
Text.Upper
,Text.Lower
, 変換テーブルで正規化 -
先に 重複排除(キーが重複すると多対多で膨張)
6-2. 行が何倍にも膨らむ(多対多)
-
多対多なら膨張は仕様。**事前に集約(Group By)**して粒度を揃える
-
どうしても多対多が必要なら、後で重複排除や集計で戻す設計を
6-3. 速度が極端に遅い
-
結合前に 不要列を削除、期間で絞り込み(上流に寄せる)
-
可能ならソース側(SQL/ビュー)で事前に結合して件数を減らす
-
折りたたみ(Query Folding)を壊すステップを結合より後ろへ移動
-
右テーブルが小さいなら、
Table.Buffer
でキャッシュすると改善することも(乱用厳禁)
6-4. ファジー結合の誤検知
-
しきい値を上げる(0.8→0.9 など)
-
同音異義語や新旧名の変換テーブルを併用
-
重要列は 完全一致、補助列のみ Fuzzy にする
7. M 言語テンプレ(そのまま使える)
7-1. 左外部結合(典型例)
let
SourceSales = Sales, // 例: 取り込んだ売上表
SourceProducts= Products, // 例: 取り込んだ商品マスタ
// キーを前処理(型合わせ・トリミング・大文字統一)
SalesKeyPrep = Table.TransformColumns(SourceSales, {{"ProductID", Text.From, type text}}),
ProdKeyPrep = Table.TransformColumns(SourceProducts, {{"ProductID", Text.From, type text}}),
Merged = Table.NestedJoin(
SalesKeyPrep, {"ProductID"},
ProdKeyPrep, {"ProductID"},
"Products", JoinKind.LeftOuter
),
Expanded = Table.ExpandTableColumn(Merged, "Products", {"ProductName","Category"},
{"商品名","カテゴリ"})
in
Expanded
7-2. 不一致(左アンチ)を抽出して品質チェック
let
Merged = Table.NestedJoin(Sales, {"ProductID"}, Products, {"ProductID"},
"Products", JoinKind.LeftOuter),
UnmatchedOnly = Table.SelectRows(Merged, each Table.IsEmpty([Products])),
Clean = Table.RemoveColumns(UnmatchedOnly, {"Products"})
in
Clean
7-3. 複数列キー(店舗×日付×商品)
let
Merged = Table.NestedJoin(
Sales, {"StoreID","Date","ProductID"},
Plan , {"StoreID","Date","ProductID"},
"Plan", JoinKind.Inner
),
Expanded = Table.ExpandTableColumn(Merged, "Plan", {"PlanQty"}, {"計画数量"})
in
Expanded
7-4. ファジー結合(名称ゆらぎを許容)
let
FuzzyMerged = Table.FuzzyNestedJoin(
Sales, {"ProductName"},
Products, {"ProductName"},
"Products",
JoinKind.LeftOuter,
[ IgnoreCase = true, Threshold = 0.85, TransformationTable = MappingTable ]
),
Expanded = Table.ExpandTableColumn(FuzzyMerged, "Products", {"ProductID","Category"},
{"ProductID","カテゴリ"})
in
Expanded
MappingTable
は旧名→新名などの正規化用テーブル。power bi クエリのマージでファジーとセット運用すると誤一致が激減します。
8. いつマージ?いつ“関係”で済ます?
-
マージ(Power Query):列を物理的に増やしたい、読み込み前にデータを整形したい、品質チェックをしたい
-
関係(モデル):Fact と Dimension を分け、DAX/ビジュアル上で動的に参照したい
大規模モデルでは、むやみにpower bi クエリのマージで列を増やすとメモリが膨らみます。マスタはディメンション化して“関係”で参照、どうしても必要な列だけマージして持ち込むのが定石です。
9. 実務で役立つ設計パターン10
-
商品名付与:売上にマスタの正式名称・カテゴリを LeftOuter
-
未登録SKU検出:LeftAnti で差分一覧をアラートページに表示
-
計画との突合:
Store×Date×SKU
の Inner で実績と計画を横持ち -
得意先名ゆらぎ吸収:Fuzzy+変換テーブル→最終は完全一致で再マージ
-
在庫引当:倉庫×SKU でマージ→不足は LeftAnti で抽出
-
配送リードタイム付与:
Region×Carrier
で SLA を結合し KPI 算出 -
為替レート付与:日付×通貨でマージ→金額換算
-
組織改編対応:旧→新コード変換テーブルを都度マージして歴史整合
-
住所の標準化:町名辞書をマージ→地図の粒度を統一
-
監査ログ突合:ユーザー×日時でアクティビティに権限情報を付与
どれも power bi クエリのマージ の組合せで実現できます。
10. パフォーマンス最適化の基本(短く効く)
-
早く絞る:日付範囲/必要列だけに。マージ前に削るほど速い
-
折りたたみ維持:フィルター・型指定・列削除は上流へ、カスタム列・行ごと処理は最後に
-
キーの単純化:複合キーはテキスト連結より列の複選択で指定(比較が軽い)
-
右テーブルを小さく:マスタの列/行を最小化(必要な列だけ)
-
ステップ順序:
フィルター→列削除→型→マージ→展開→(必要なら)追加計算
-
検証は小さく:一時的に
Table.FirstN
で 1000 行に絞り、動作確認→戻す
これだけで power bi クエリのマージ の体感速度は大きく変わります。
11. 監査・品質の見える化(再発防止)
-
不一致件数をカードで表示(LeftAnti の行数)
-
最終マージ日時をテキストで明示(
DateTime.LocalNow()
をパラメータ化) -
マージ結果の重複率(行数のビフォー/アフター比)で膨張検知
-
重要テーブルは キーの一意性を読み込み時に
Group By
→Count
でチェック
power bi クエリのマージは“やって終わり”ではなく、監視で品質を守るのがプロの仕事です。
12. ケース別トラブルシュート
Q1. マージ後に展開したら同じ列名が衝突する
→ 展開時に別名を付ける。既存列と区別できる命名規則(_FromMaster
など)を。
Q2. マージのプレビューが終わらない
→ 右テーブルが巨大。先にフィルターと不要列削除、場合によってはビュー化。
Q3. 文字列キーのスペース違いで一致しない
→ 事前に Text.Trim
、全角スペース→半角置換、Text.Upper
で統一。
Q4. 似た商品名が誤って結合される(Fuzzy)
→ しきい値↑、MaxMatchesPerRecord=1
の指定、最終的に人手レビュー用の確認ページを作る。
Q5. 多対多で数字が重複計上される
→ 左右いずれかを集約して粒度を揃えるか、マージ後に集計列だけ残して明細を落とす。
13. チェックリスト(コピペOK)
-
キー列の型は一致している(数値/テキスト/日付)
-
前処理(Trim/Upper/置換)が入っている
-
キーは論理的一意(必要なら複数列)
-
結合タイプは目的に合っている(LeftOuter/Inner/Anti/Full/Fuzzy)
-
マージ前にフィルター/不要列削除をしている
-
展開列は必要最小限、衝突しない命名
-
多対多の膨張対策(集約/重複排除)をした
-
折りたたみを壊すステップは後方に寄せた
-
不一致件数・重複率の監視を入れた
-
可能なものは**関係(モデル)**で置き換えてメモリを節約
14. まとめ:正しく“くっつける”だけで、分析は一段変わる
-
power bi クエリのマージは“列を増やす前処理”。
-
成功の鍵は 型合わせ、結合タイプの使い分け、粒度の整合。
-
不一致検出(アンチ結合)とファジーの併用は、現場の“名寄せ”に特に効く。
-
速さは正義。上流で絞る・折りたたみ維持・不要列削除を癖に。
-
監視を仕込めば、品質は自動的に保たれる。
今日から、あなたのレポートづくりの最初の一歩にpower bi クエリのマージを置いてみてください。
“きちんとくっつける”だけで、ダッシュボードの説得力と作業スピードは確実に上がります。
コメント