MySQLで各行の大きい値を持つ列の合計を選択する方法
MySQLでは、CASE文を使って条件を設定することで、各行における大きい方の列値だけを取り出し、その合計を簡単に求めることができます。本記事では、実際にテーブルを作成しながら、その手順をわかりやすく解説します。
テーブルの作成
まず、サンプル用のテーブルを作成しましょう。
mysql> create table DemoTable
-> (
-> X int,
-> Y int
-> );
Query OK, 0 rows affected (0.57 sec)XとYという2つのint型カラムを持つテーブル「DemoTable」が作成できました。
レコードの挿入
次に、INSERTコマンドを使ってテーブルにデータを挿入します。
mysql> insert into DemoTable values(20,30); Query OK, 1 row affected (0.15 sec) mysql> insert into DemoTable values(40,15); Query OK, 1 row affected (0.14 sec) mysql> insert into DemoTable values(80,85); Query OK, 1 row affected (0.13 sec)
データの確認
SELECT文を使って、テーブル内のすべてのレコードを表示してみましょう。
mysql> select *from DemoTable;
出力結果
上記のクエリを実行すると、以下のような結果が得られます。
+------+------+ | X | Y | +------+------+ | 20 | 30 | | 40 | 15 | | 80 | 85 | +------+------+ 3 rows in set (0.00 sec)
各行の大きい値の合計を求めるクエリ
ここからが本題です。CASE文をSUM関数と組み合わせることで、各行においてXとYのどちらか大きい方の値を判定し、それらを合計できます。
mysql> SELECT SUM(CASE WHEN X > Y THEN X ELSE Y END) from DemoTable;
このクエリの仕組みは以下の通りです。
- X > Y の場合: Xの値を採用する(THEN X)
- それ以外の場合: Yの値を採用する(ELSE Y)
今回のサンプルデータでは、「20と30 → 30」「40と15 → 40」「80と85 → 85」となり、これらの合計が算出されます。
出力結果
+----------------------------------------+ | SUM(CASE WHEN X > Y THEN X ELSE Y END) | +----------------------------------------+ | 155 | +----------------------------------------+ 1 row in set (0.00 sec)
まとめ
CASE文は条件分岐を行うSQLの基本構文ですが、SUMなどの集計関数と組み合わせると非常に強力なツールになります。今回のように「各行の大きい方の値を合計したい」といったケースだけでなく、条件に応じた柔軟な集計処理にも応用できるので、ぜひ覚えておきましょう。
-
MySQLで重複する列の値ごとに最小値を含む行を取得する方法
この記事では、MySQLにおいて重複する値を持つ列(ここでは「Class」)ごとに、別の列(「Amount」)の最小値を取得する方法を解説します。GROUP BY句とMIN()関数を組み合わせることで、カテゴリ別の最小値を簡単かつ効率的に抽出できます。1. サンプルテーブルの作成まず、以下のコマンドでテーブルを作成します。mysql> create table DemoTable1875 ( Id int NOT NULL AUTO_INCREMENT PRIMARY KEY, Class varchar(20), Amount int ); Que
-
MySQLで列が複数の値をすべて満たす行を選択する方法|GROUP BY・HAVING句の使い方
MySQLである列が「複数の値をすべて満たしている」行だけを抽出したい場合、IN()句と GROUP BY、そして HAVING 句を組み合わせることで実現できます。この記事では、具体的なサンプルを使いながら手順をわかりやすく解説します。1. サンプルテーブルを作成するまず、テスト用のテーブルを作成します。ここでは氏名(FirstName)と科目(Subject)を持つシンプルなテーブルを用意しました。mysql> create table DemoTable1885 ( FirstName varchar(20), Subject varchar(50)