【SQL初心者向け】異なるテーブルの値を合計する方法3選! JOIN、サブクエリ、CASE式を使いこなそう

2024-07-27

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 THEN1
         WHEN 条件2 THEN2
         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



C#/VB.NET プログラマー必見!T-SQL CAST デコードのすべて

T-SQL CAST は、データを異なるデータ型に変換する関数です。C#/VB. NET で T-SQL CAST を使用する場合、デコードが必要になることがあります。この解説では、T-SQL CAST のデコード方法について、C#/VB...


データベースアプリケーションにおける XSD データセットと外部キーの重要性

XSD データセットは、XML スキーマ定義 (XSD) を使用して定義されたデータの集合です。.NET では、DataSet クラスを使用して XSD データセットを表します。外部キーは、データベースの 2 つのテーブル間の関連を表す制約です。XSD データセットでは、ForeignKeyConstraint クラスを使用して外部キーを表します。...


SQL Serverデータベースのバージョン管理:Subversion(SVN)との連携方法

この解説では、Subversion(SVN)と呼ばれるバージョン管理システムを用いて、SQL Serverデータベースのバージョン管理を行う方法について説明します。SVNは、ファイルやディレクトリのバージョン管理に広く用いられるオープンソースツールであり、データベースのバージョン管理にも活用できます。...


.NET Framework と SQLite を使用して XSD データセットに基づいて SQLite データベースを作成する方法

このチュートリアルを完了するには、次のものが必要です。Visual Studio 2019 以降.NET Framework 4.7 以降SQLite ADO. NET プロバイダVisual Studio で新しい C# コンソール アプリケーション プロジェクトを作成します。...


Subversion を使用したデータベース構造変更のバージョン管理

データベース構造変更をバージョン管理システムで管理することは、データベースの開発と運用において非常に重要です。バージョン管理システムを使用することで、以下のメリットを得ることができます。変更履歴の追跡: 過去の変更内容を詳細に追跡することができ、どの変更が問題を引き起こしたのかを特定しやすくなります。...



SQL SQL SQL SQL Amazon で見る



ストアドプロシージャ、ライブラリ、フレームワーク...MySQLでバイナリデータを扱うためのツール

BINARY:固定長のバイナリデータ型。最大255バイトまで保存できます。BLOB:可変長のバイナリデータ型。最大65, 535バイトから4GBまで保存できます。TEXT:可変長の文字列型。最大65, 535バイトから4GBまで保存できます。バイナリデータだけでなく、文字列も保存できます。


MySQLトリガーでテーブル更新を防止するエラーをスローする方法

MySQLトリガーは、特定のデータベース操作に対して自動的に実行されるコードです。トリガーを使用して、テーブル更新を防止するエラーをスローすることができます。例:以下の例は、usersテーブルのage列が18歳未満の場合に更新を防止するトリガーです。


SQL Server Profilerを使ってSQL Serverテーブルの変更をチェックする

Change Trackingは、テーブルレベルで変更されたデータを追跡する機能です。有効にすると、どの行が挿入、更新、削除されたかを追跡できます。メリット比較的軽量な機能設定が簡単クエリで変更内容を取得できる変更されたデータの内容は追跡できない


初心者でも安心!PHPでフラットファイルデータベースを始めるためのガイド

PHPは、Web開発に広く使用されているプログラミング言語です。SQLは、データベースとのやり取りに使用される構造化照会言語です。フラットファイルデータベースは、PHPとSQLを使用して読み書きできます。軽量で高速設定と管理が簡単習得しやすい


初心者でも安心!PHPでフラットファイルデータベースを始めるためのガイド

PHPは、Web開発に広く使用されているプログラミング言語です。SQLは、データベースとのやり取りに使用される構造化照会言語です。フラットファイルデータベースは、PHPとSQLを使用して読み書きできます。軽量で高速設定と管理が簡単習得しやすい