MySQLで同じIDの行を統合し、各列の最大値を表示するクエリの書き方
同じIDを持つ複数の行を1つの行にまとめて、各列ごとの最大値を取得したい場合には、集計関数MAX()とGROUP BY句を組み合わせて使用します。この記事では、実際にテーブルを作成しながら手順を詳しく解説していきます。
サンプルテーブルの作成
まず、動作確認用のテーブルを作成しましょう。
mysql> create table DemoTable ( Id int, Value1 int, Value2 int, Value3 int, Value4 int ); Query OK, 0 rows affected (0.61 sec)
テストデータの挿入
次に、INSERT文を使ってレコードを挿入します。ここでは、同じID(100)に対して、列ごとに異なる値が分散した状態のデータを登録しています。
mysql> insert into DemoTable(Id,Value4) values(100,30); Query OK, 1 row affected (0.14 sec) mysql> insert into DemoTable(Id,Value1,Value2,Value3) values(100,20,60,40); Query OK, 1 row affected (0.14 sec) mysql> insert into DemoTable(Id,Value2,Value3,Value4) values(100,90,100,110); Query OK, 1 row affected (0.10 sec)
登録されたデータの確認
SELECT文ですべてのレコードを表示してみましょう。
mysql> select *from DemoTable;
上記のクエリを実行すると、以下のような結果が出力されます。
+------+--------+--------+--------+--------+ | Id | Value1 | Value2 | Value3 | Value4 | +------+--------+--------+--------+--------+ | 100 | NULL | NULL | NULL | 30 | | 100 | 20 | 60 | 40 | NULL | | 100 | NULL | 90 | 100 | 110 | +------+--------+--------+--------+--------+ 3 rows in set (0.00 sec)
このように、ID「100」のデータが3行に分かれて登録されていることが確認できます。
行を統合して最大値を表示するクエリ
それでは本題です。同じIDの行を1つにまとめ、その他の列からはそれぞれ最大の値を表示するには、以下のようにクエリを記述します。
mysql> select Id,max(Value1) as Value1,max(Value2) as Value2,max(Value3) as Value3,max(Value4) as Value4 from DemoTable group by Id;
実行結果は以下の通りです。
+------+--------+--------+--------+--------+ | Id | Value1 | Value2 | Value3 | Value4 | +------+--------+--------+--------+--------+ | 100 | 20 | 90 | 100 | 110 | +------+--------+--------+--------+--------+ 1 row in set (0.00 sec)
ポイントの解説
GROUP BY Idによって、IDが同じ行がグループ化され、1行にまとめられます。そして各列にはMAX()関数を適用することで、グループ内の最大値だけが抽出されます。NULLはMAX()の集計対象として無視されるため、NULLと数値が混在している列でも正しく最大値を取得できるのが便利な点です。
同様の考え方は、MIN()(最小値)やSUM()(合計値)、AVG()(平均値)など、他の集計関数でも応用できます。データが複数の行に分かれて登録されてしまうケースの整理に、ぜひ活用してください。
-
MySQLで列の値ごとに「NO」の件数のみをカウントして返すクエリの書き方
MySQLでは、SUM()関数と条件式を組み合わせることで、グループごとに特定の値(この例では「NO」)が出現した回数だけをカウントできます。ここでは、ENUM型のカラムを持つテーブルを例に、「NO」の件数のみを集計する方法を具体的な手順とともに解説します。 1. テーブルを作成する まず、サンプル用のテーブルを作成します。isTopperカラムはENUM型で、「YES」または「NO」のいずれかの値を持ちます。 mysql> create table DemoTable1829 ( Name varchar(
-
複数行の文字列を1行に結合し、対応するIDの合計も表示するMySQLクエリの書き方
GROUP_CONCAT()とSUM()を組み合わせた集計方法複数行に分かれた文字列を1つの行にまとめて結合し、さらにIDの合計値を別の列として同時に表示したい場合は、GROUP_CONCAT()関数とSUM()関数を組み合わせることで実現できます。ここでは、実際にテーブルを作成し、動作を確認する手順を見ていきましょう。1. サンプルテーブルの作成まず、学生IDと学生名を持つテーブルを作成します。mysql> create table DemoTable1960 ( StudentId int, StudentName varchar(20) ); Que