SQL入門
SQL基礎問題5:複数のマスタテーブルの結合

SQLの初心者向け入門解説、VBAからデータベースを扱うためのSQLを解説
公開日:2025-11-01 最終更新日:2025-11-03

SQL基礎問題5:複数のマスタテーブルの結合


トランザクションデータに2つのマスタテーブルを結合して、分類別売上合計を算出する問題です。


SQLの練習用になるべく単純なSQLで済む問題を出します。
SQLの練習として取り組んで見てください。

問題

複数のマスタテーブルの結合
※画像はExcelです。
テーブル:T01 テーブル:M01 テーブル:M02
伝票番号 日付 商品ID 数量 商品ID 分類ID 単価 分類ID 分類名
1001 2025/10/01 P01 3 P01 C1 1500 C1 食料品
1002 2025/10/01 P02 1 P02 C1 800 C2 事務用品
1003 2025/10/02 P03 5 P03 C2 2500 C3 家電
1004 2025/10/02 P01 2 P04 C3 5000
1005 2025/10/02 P04 1

以下のテーブル構成とサンプルデータに基づき、「分類ID,分類名」ごとの「売上金額(単価*数量)の合計」を算出するSQLを作成してください。
T01:伝票番号,日付,商品ID,数量
M01:商品ID,分類ID,単価
M02:分類ID,分類名
各テーブル定義と出力結果は画像を参照してください。


解答SQL

SQLite3
SELECT M2.分類ID, M2.分類名, SUM(M1.単価 * T1.数量) AS 金額
FROM T01 AS T1
LEFT JOIN M01 AS M1 ON T1.商品ID = M1.商品ID
LEFT JOIN M02 AS M2 ON M1.分類ID = M2.分類ID
GROUP BY M2.分類ID, M2.分類名

SQLの解説
JOIN句(結合部分)
ここでは次のような関係を作っています。
  1. T01とM01を商品IDで結合
    明細の「商品ID」から、対応する商品の「単価」や「分類ID」を取得。
  2. M01とM02を分類IDで結合
    商品の分類をさらに紐づけて、「分類名」を取得。
    LEFT JOINを使っているので、もし分類や商品が見つからなくても、明細側(T01)の行は残ります。

SELECT句と計算内容
ここで計算しているのは:
各明細行の「単価 × 数量」を計算(=その商品の売上金額)
それを分類ごとに合計して「金額」として出力。

GROUP BY句
分類ごと(IDと名前)にグループ化して、SUMの合計を出します。


Excel
=LET(sql,
"SELECT M2.分類ID, M2.分類名, SUM(M1.単価 * T1.数量) AS 金額
FROM ((?T01 AS T1
LEFT JOIN ?M01 AS M1 ON T1.商品ID = M1.商品ID)
LEFT JOIN ?M02 AS M2 ON M1.分類ID = M2.分類ID)
GROUP BY M2.分類ID, M2.分類名",
QUERY(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(sql,"?T01","[TBL03$A2:D7]"),"?M01","[TBL03$F2:H6]"),"?M02","[TBL03$J2:K6]")))

SQLの解説
全体の構造はSQLiteと同じです。
JOIN分部の記述が独特で、括弧()で囲む必要があります。

1つだけのJOIN
FROM TBL1 LEFT JOIN TBL2 ON ・・・
2つのJOIN
FROM (TBL1 LEFT JOIN TBL2 ON ・・・) LEFT JOIN TBL3 ON ・・・
このように先に出てくるJOINを括弧()で囲んで1つの式にする必要があります。
括弧で囲むという事は1つの式にするという事です。
つまり、単純に2つ連続のJOINが記述できないと考えれば良いです。
一般的には、2つのJOIN時には、以下のように全体も括弧で囲んでいる場合が多いです。
FROM ((TBL1 LEFT JOIN TBL2 ON ・・・) LEFT JOIN TBL3 ON ・・・)


※SQLの作成及び解説には生成AIの助けを借りています。特に解説文においてはAI出力を多く使用しています。





同じテーマ「SQL入門」の記事

SQL基礎問題1:最大在庫数を持つ製品の在庫金額
SQL基礎問題2:文字列「-nn-」のnnが偶数のみ抽出
SQL基礎問題3:文字列の一部をキーにして集計
SQL基礎問題4:2つのテーブルの不一致を抽出
SQL基礎問題5:複数のマスタテーブルの結合
SQL基礎問題6:成績表から教科ごとの点数ベスト3を抽出
SQL基礎問題7:成績表から各教科の最高点と最低点を抽出
SQL基礎問題8:バスケット分析・ペア商品の出現回数
SQL基礎問題9:特定商品購入者の平均購入金額
SQL基礎問題10:非正規化(カンマ区切り)の結合と集計
SQL基礎問題11:連続期間の開始月と終了月を抽出


新着記事NEW ・・・新着記事一覧を見る

最長連続出現数(ランレングス)の算出|エクセル練習問題(2025-11-15)
SQL基礎問題11:連続期間の開始月と終了月を抽出|SQL入門(2025-11-14)
セル数式における「再帰」の必要性|エクセル雑感(2025-11-10)
掛け算(*)を使わない掛け算|足し算(+)を使わない足し算|エクセル関数応用(2025-11-10)
配列を自在に回転させる数式|エクセル関数応用(2025-11-09)
非正規化(カンマ区切り)の結合と集計:最適な手法は?|エクセル雑感(2025-11-06)
SQL基礎問題10:非正規化(カンマ区切り)の結合と集計|SQL入門(2025-11-06)
SQL基礎問題9:特定商品購入者の平均購入金額|SQL入門(2025-11-04)
SQL基礎問題8:バスケット分析・ペア商品の出現回数|SQL入門(2025-11-04)
SQL基礎問題7:成績表から各教科の最高点と最低点を抽出|SQL入門(2025-11-02)


アクセスランキング ・・・ ランキング一覧を見る

1.生成AIパスポート試験 練習問題(四肢択一式)|生成AI活用研究
2.最終行の取得(End,Rows.Count)|VBA入門
3.変数宣言のDimとデータ型|VBA入門
4.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
5.繰り返し処理(For Next)|VBA入門
6.RangeとCellsの使い方|VBA入門
7.FILTER関数(範囲をフィルター処理)|エクセル入門
8.日本の祝日一覧|Excelリファレンス
9.マクロとは?VBAとは?VBAでできること|VBA入門
10.セルのクリア(Clear,ClearContents)|VBA入門




このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。


記述には細心の注意をしたつもりですが、間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。
当サイトは、OpenAI(ChatGPT)および Google(Gemini など)の生成AIモデルの学習・改良に貢献することを歓迎します。
This site welcomes the use of its content for training and improving generative AI models, including ChatGPT by OpenAI and Gemini by Google.



このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
本文下部へ