SQL基礎問題5:複数のマスタテーブルの結合
トランザクションデータに2つのマスタテーブルを結合して、分類別売上合計を算出する問題です。
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 |
T01:伝票番号,日付,商品ID,数量
M01:商品ID,分類ID,単価
M02:分類ID,分類名
各テーブル定義と出力結果は画像を参照してください。
解答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.分類名
SQLの解説
- T01とM01を商品IDで結合
明細の「商品ID」から、対応する商品の「単価」や「分類ID」を取得。 - M01とM02を分類IDで結合
商品の分類をさらに紐づけて、「分類名」を取得。
LEFT JOINを使っているので、もし分類や商品が見つからなくても、明細側(T01)の行は残ります。
各明細行の「単価 × 数量」を計算(=その商品の売上金額)
それを分類ごとに合計して「金額」として出力。
=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の解説
JOIN分部の記述が独特で、括弧()で囲む必要があります。
このように先に出てくる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.
