【SQL初心者向け】異なるテーブルの値を合計する方法3選! JOIN、サブクエリ、CASE式を使いこなそう
SQL: 異なる2つのテーブルの値を合計する方法
方法1: JOINとSUM関数を使う
最も基本的な方法は、JOINを使って2つのテーブルを結合し、SUM関数を使って合計値を求める方法です。
SELECT
結合列,
SUM(テーブル1.値列) AS テーブル1_合計,
SUM(テーブル2.値列) AS テーブル2_合計
FROM テーブル1
JOIN テーブル2 ON 結合条件
GROUP BY 結合列;
例:
-- 注文テーブル (orders) と商品テーブル (products) を結合し、注文ごとの商品合計金額を算出
SELECT
o.order_id,
SUM(p.price * o.quantity) AS 合計金額
FROM orders o
JOIN products p ON o.product_id = p.product_id
GROUP BY o.order_id;
方法2: サブクエリを使う
サブクエリを使って、一方のテーブルの値をもう一方のテーブルのクエリ内で参照する方法です。
SELECT
列名,
(SELECT SUM(値列) FROM テーブル2 WHERE 条件) AS 合計値
FROM テーブル1;
-- 顧客テーブル (customers) と注文テーブル (orders) を結合し、顧客ごとの注文合計金額を算出
SELECT
c.customer_id,
(SELECT SUM(o.amount) FROM orders o WHERE o.customer_id = c.customer_id) AS 合計注文金額
FROM customers c;
方法3: CASE式を使う
CASE式を使って、条件に応じて値を合計する方法です。
SELECT
列名,
SUM(
CASE WHEN 条件1 THEN 値1
WHEN 条件2 THEN 値2
ELSE 0
END
) AS 合計値
FROM テーブル;
-- 商品テーブル (products) の在庫状況に応じて、合計在庫数を算出
SELECT
category,
SUM(
CASE WHEN stock_status = '在庫あり' THEN quantity
ELSE 0
END
) AS 合計在庫数
FROM products
GROUP BY category;
- 上記の例は基本的なものです。実際の状況に合わせて、結合条件や集計関数などを調整する必要があります。
- 複数の列を結合する場合は、ON句で結合条件を指定します。
- GROUP BY句を使って、集計単位を指定することができます。
- HAVING句を使って、集計結果に対して条件を絞り込むことができます。
-- テーブル定義
CREATE TABLE orders (
order_id INT PRIMARY KEY,
customer_id INT,
product_id INT,
quantity INT,
FOREIGN KEY (customer_id) REFERENCES customers(customer_id),
FOREIGN KEY (product_id) REFERENCES products(product_id)
);
CREATE TABLE products (
product_id INT PRIMARY KEY,
product_name VARCHAR(255),
price DECIMAL(10,2)
);
-- データ挿入
INSERT INTO orders (order_id, customer_id, product_id, quantity)
VALUES
(1, 1, 1, 2),
(1, 2, 3, 1),
(2, 1, 2, 1),
(3, 2, 1, 3);
INSERT INTO products (product_id, product_name, price)
VALUES
(1, 'Tシャツ', 12.50),
(2, '靴', 55.00),
(3, '帽子', 15.00);
-- サンプルコード
SELECT
o.order_id,
SUM(p.price * o.quantity) AS 合計金額
FROM orders o
JOIN products p ON o.product_id = p.product_id
GROUP BY o.order_id;
出力結果:
order_id | 合計金額
------- | --------
1 | 37.50
2 | 55.00
3 | 45.00
説明:
- 上記のコードは、まず orders テーブルと products テーブルを定義しています。
- orders テーブルには、注文ID、顧客ID、商品ID、個数などの情報が格納されます。
- products テーブルには、商品ID、商品名、価格などの情報が格納されます。
- 次に、orders テーブルと products テーブルにデータを挿入します。
- SELECT 句では、出力する列を指定します。この例では、注文IDと合計金額を出力します。
- FROM 句では、使用するテーブルを指定します。この例では、orders テーブルと products テーブルを使用します。
- JOIN 句を使って、2つのテーブルを結合します。この例では、orders.product_id 列と products.product_id 列を結合条件としています。
- GROUP BY 句を使って、集計単位を指定します。この例では、注文IDごとに集計します。
- SUM 関数を使って、合計値を算出します。この例では、products.price 列と orders.quantity 列を掛け合わせた値を合計します。
他の方法
ここでは、状況に応じて使える他の方法をご紹介します。
-- 顧客テーブル (customers) と注文テーブル (orders) を結合し、顧客ごとの注文合計金額を算出
SELECT
c.customer_id,
(SELECT SUM(o.amount) FROM orders o WHERE o.customer_id = c.customer_id) AS 合計注文金額
FROM customers c;
- サブクエリは、SELECT 句、FROM 句、WHERE 句で構成されています。
- サブクエリは、c.customer_id と一致する orders.customer_id のレコードの合計金額を算出します。
- メインクエリは、customers テーブルから顧客IDと合計注文金額を取得します。
-- 商品テーブル (products) の在庫状況に応じて、合計在庫数を算出
SELECT
category,
SUM(
CASE WHEN stock_status = '在庫あり' THEN quantity
ELSE 0
END
) AS 合計在庫数
FROM products
GROUP BY category;
- この方法は、CASE式を使って、在庫状況に応じて商品の個数を集計しています。
- CASE 式には、WHEN 句と ELSE 句があります。
- WHEN 句では、条件を指定します。この例では、stock_status が '在庫あり' の場合を指定しています。
- ELSE 句では、条件に一致しない場合の値を指定します。この例では、0 を指定しています。
- SUM 関数を使って、CASE 式の結果を合計します。
- ウィンドウ関数を使う: 特定の行範囲内での集計などに役立ちます。
- 共通表式 (CTE) を使う: 複雑なクエリをより分かりやすく分割できます。
どの方法を選択するかは、状況によって異なります。
- シンプルな集計の場合は、方法1 が適しています。
- より複雑な集計や、サブクエリを使用する場合は、方法2 が適しています。
- 条件に応じて値を合計する場合は、方法3 が適しています。
sql database