MySQLで列ごとにグループ化し、類似値の合計を別の列として表示するクエリの書き方
特定の列で値をグループ化し、その合計値を条件付きで取得したい場合は、GROUP BY句とHAVING句を組み合わせて使用します。WHERE句では集計後の結果を絞り込めないため、SUM()などの集計関数の結果に対して条件を適用したいときはHAVING句が必要になります。
ここでは、実際のサンプルを通じて手順を詳しく解説します。
1. サンプルテーブルを作成する
まず、名前(Name)とスコア(Score)を持つテーブルを作成します。
mysql> create table DemoTable782 ( Name varchar(100), Score int ); Query OK, 0 rows affected (1.18 sec)
2. テストデータを挿入する
INSERT文を使って複数のレコードを登録します。同じ人物のスコアが複数行に分かれているのがポイントです。
mysql> insert into DemoTable782 values('John',156);
Query OK, 1 row affected (0.18 sec)
mysql> insert into DemoTable782 values('Carol',250);
Query OK, 1 row affected (0.15 sec)
mysql> insert into DemoTable782 values('Bob',140);
Query OK, 1 row affected (0.17 sec)
mysql> insert into DemoTable782 values('John',126);
Query OK, 1 row affected (0.29 sec)
mysql> insert into DemoTable782 values('John',140);
Query OK, 1 row affected (0.17 sec)
mysql> insert into DemoTable782 values('Bob',280);
Query OK, 1 row affected (0.17 sec)
mysql> insert into DemoTable782 values('Bob',250);
Query OK, 1 row affected (0.41 sec)
mysql> insert into DemoTable782 values('Carol',189);
Query OK, 1 row affected (0.17 sec)
mysql> insert into DemoTable782 values('Carol',299);
Query OK, 1 row affected (0.21 sec)
3. 登録されたデータを確認する
SELECT文ですべてのレコードを表示してみましょう。
mysql> select *from DemoTable782;
実行結果は以下の通りです。
+-------+-------+ | Name | Score | +-------+-------+ | John | 156 | | Carol | 250 | | Bob | 140 | | John | 126 | | John | 140 | | Bob | 280 | | Bob | 250 | | Carol | 189 | | Carol | 299 | +-------+-------+ 9 rows in set (0.00 sec)
4. グループ化して合計値を表示するクエリ
次のクエリでは、Name列でグループ化し、各グループのScoreの合計を「Total」という別名の列として表示しています。さらにHAVING句により、合計が500より大きいグループだけを抽出しています。
mysql> select Name,SUM(Score) AS Total from DemoTable782 group by Name HAVING Total > 500;
実行結果:
+-------+-------+ | Name | Total | +-------+-------+ | Carol | 738 | | Bob | 670 | +-------+-------+ 2 rows in set (0.00 sec)
解説:GROUP BYとHAVINGの役割
このクエリの動作を整理すると、以下のようになっています。
- GROUP BY Name:同じ名前の行を1つのグループにまとめます。
- SUM(Score) AS Total:各グループ内のスコアを合計し、「Total」という列名で出力します。
- HAVING Total > 500:集計後の合計値が500を超えるグループのみを結果に残します。
Johnの合計は422であるため条件を満たさず、結果には表示されません。このように、集計関数の結果に対してフィルタリングを行いたい場合は、WHERE句ではなくHAVING句を使用する点が重要です。
-
MySQLで列の値と任意のテキストを連結して1つの列に表示する方法
MySQLで列の値とテキストを連結する方法MySQLでは、CONCAT()関数を使用することで、テーブルの列の値と任意のテキストを連結し、結果を1つの列として表示できます。本記事では、サンプルテーブルを作成し、実際に文字列を連結して表示するまでの手順を具体例とともに解説します。1. テーブルの作成まず、テーブルを作成しましょう。mysql> create table DemoTable -> ( -> Id int, -> Name varchar(20) -> );Query OK, 0 rows affected (0.93 sec)こ
-
複数行の文字列を1行に結合し、対応するIDの合計も表示するMySQLクエリの書き方
GROUP_CONCAT()とSUM()を組み合わせた集計方法複数行に分かれた文字列を1つの行にまとめて結合し、さらにIDの合計値を別の列として同時に表示したい場合は、GROUP_CONCAT()関数とSUM()関数を組み合わせることで実現できます。ここでは、実際にテーブルを作成し、動作を確認する手順を見ていきましょう。1. サンプルテーブルの作成まず、学生IDと学生名を持つテーブルを作成します。mysql> create table DemoTable1960 ( StudentId int, StudentName varchar(20) ); Que