GROUP BY句とMySQLのSUM()関数を組み合わせるメリットとは?
MySQLのSUM()関数をGROUP BY句と組み合わせて使用すると、GROUP BY句で指定された各グループごとに合計値が計算されます。この組み合わせ最大のメリットは、特定のグループの合計を簡単に求められる点にあります。
サンプルテーブルの準備
ここでは、以下のレコードを持つ「employee_tbl」テーブルを使って、その仕組みを具体的に見ていきましょう。
mysql> SELECT * FROM employee_tbl; +------+------+------------+--------------------+ | id | name | work_date | daily_typing_pages | +------+------+------------+--------------------+ | 1 | John | 2007-01-24 | 250 | | 2 | Ram | 2007-05-27 | 220 | | 3 | Jack | 2007-05-06 | 170 | | 3 | Jack | 2007-04-06 | 100 | | 4 | Jill | 2007-04-06 | 220 | | 5 | Zara | 2007-06-06 | 300 | | 5 | Zara | 2007-02-06 | 350 | +------+------+------------+--------------------+ 7 rows in set (0.00 sec)
このテーブルには、同じ人物が複数日分のレコードを持っているケース(JackやZaraなど)が含まれています。
GROUP BY句とSUM()関数の組み合わせ例
次のクエリを実行すると、人物ごとにレコードがグループ化され、各自が入力したページ数の合計を一度に取得できます。
mysql> SELECT name, SUM(daily_typing_pages)
-> FROM employee_tbl GROUP BY name;
+------+-------------------------+
| name | SUM(daily_typing_pages) |
+------+-------------------------+
| Jack | 270 |
| Jill | 220 |
| John | 250 |
| Ram | 220 |
| Zara | 650 |
+------+-------------------------+
5 rows in set (0.17 sec)実行結果のポイント
結果を見ると、たとえばJackは170ページと100ページの2レコードが合計されて270となり、Zaraも300ページと350ページが合計されて650と表示されています。このように、同一人物の複数レコードが1行にまとめられ、それぞれの合計値が算出されます。
GROUP BY句とSUM()関数を併用すれば、人物別・日付別・カテゴリ別といった集計処理を、シンプルなSQL一文で効率的に実現できます。売上集計やアクセスログの分析など、実務でも非常に活用場面の多いテクニックです。
-
MySQLのGROUP BYとHAVINGを使って、重複しないIDを持つレコードだけを表示する方法
MySQLでは、GROUP BY句とHAVING句を組み合わせることで、テーブル内に1回しか出現しない(重複していない)値を持つレコードだけを簡単に抽出できます。本記事では、サンプルテーブルを作成し、実際にクエリを実行しながらその手順を解説します。 1. サンプルテーブルの作成 まず、以下のようにテーブルを作成します。 mysql> create table DemoTable ( Id int, ColorName varchar(100) ); Query OK, 0 rows affected (0.56 sec) 2. テス
-
MySQLのWHERE句でSUM()関数の結果は使用できる?HAVING句を使った正しい書き方を解説
MySQLでは、SUM()などの集計関数の結果をWHERE句で直接使用することはできません。これは、WHERE句がグループ化の前に行単位で評価されるためです。代わりに、GROUP BYと組み合わせたHAVING句を使うことで、集計結果に基づいた絞り込みが可能になります。 ここからは、実際にサンプルテーブルを作成しながら手順を確認していきましょう。 1. サンプルテーブルの作成 まず、名前と価格を持つテーブルを作成します。 mysql> create table DemoTable ( Name varchar(50), Price int ); Query OK, 0