【MySQL】データのグループ化と合計・件数の取得


ここではMySQLで、GROUP BY句を使ったデータのグループ化とSUM関数を使った合計値の取得、COUNT関数を使ったレコード件数の取得方法を紹介しています。

GROUP BY:データのグループ化

テーブルのレコードを任意の単位で集約・グループ化するには、GROUP BY句を使います。

GROUP BY句の基本的な使い方は次の通りです。

SELECT 列名1[,列名2・・・] FROM 表名 GROUP BY 列名1[,列名2・・・]

GROUP BY句で指定した列でグループ化します。

GROUP BY:SQLサンプル

GROUP BY句を使ったSQLのサンプルを紹介します。

次のようなレコードが登録されている状態でGROUP BY句を使っていきます。

mysql> SELECT * FROM tab1;
+--------+----------+-------+------+
| emp_id | emp_name | dept  | age  |
+--------+----------+-------+------+
| 00001  | Suzuki   | HR    |   28 |
| 00002  | Tanaka   | SALES |   25 |
| 00003  | Kizaki   | SALES |   35 |
| 00004  | Tanaka   | DEV   |   45 |
| 00005  | Kizaki   | DEV   |   55 |
| 00006  | Nakata   | DEV   |   35 |
+--------+----------+-------+------+
6 rows in set (0.05 sec)

グループごとのレコード件数を計算する

GROUP BY句と同時にCOUNT関数を使うことで、グループごとのレコード件数を集計し取得することが出来ます。

mysql> SELECT dept,COUNT(*) FROM tab1 GROUP BY dept;
+-------+----------+
| dept  | COUNT(*) |
+-------+----------+
| DEV   |        3 |
| HR    |        1 |
| SALES |        2 |
+-------+----------+
3 rows in set (0.01 sec)

グループごとの平均・最大・合計を計算する

GROUP BY句とAVG関数、MAX関数、SUM関数を組み合わせ、平均・最大・合計を求めることが出来ます。

mysql> SELECT dept,AVG(age),MAX(age),SUM(age) FROM tab1 GROUP BY dept;
+-------+----------+----------+----------+
| dept  | AVG(age) | MAX(age) | SUM(age) |
+-------+----------+----------+----------+
| DEV   |  45.0000 |       55 |      135 |
| HR    |  28.0000 |       28 |       28 |
| SALES |  30.0000 |       35 |       60 |
+-------+----------+----------+----------+
3 rows in set (0.01 sec)

集計した値を更に条件で絞る方法

GROUP BY句で集計した値に条件を指定して、更にレコードを絞ることが出来ます。

集約した値に条件を指定する場合は、HAVING句を使います。

次のSQLでは、HAVING句でレコード件数が2件以上のレコードのみをSELECTしています。

mysql> SELECT dept,COUNT(*) FROM tab1 GROUP BY dept HAVING COUNT(*) >= 2;
+-------+----------+
| dept  | COUNT(*) |
+-------+----------+
| DEV   |        3 |
| SALES |        2 |
+-------+----------+
2 rows in set (0.00 sec)

SUM関数:合計値の取得

SUMを使うことでSELECTしたレコードの列の値の合計値を取得することが出来ます。

mysql> SELECT * FROM tab1;
+--------+-----------+-------+------+
| emp_id | emp_name  | dept  | age  |
+--------+-----------+-------+------+
| 00001  | Suzuki    | HR    |   28 |
| 00002  | Tanaka    | SALES |   25 |
| 00003  | Kizaki    | SALES |   35 |
| 00004  | Takahashi | DEV   |   45 |
| 00005  | Yoshida   | DEV   |   55 |
| 00006  | Nakata    | DEV   |   35 |
+--------+-----------+-------+------+
6 rows in set (0.04 sec)

mysql> SELECT SUM(age) FROM tab1;
+----------+
| SUM(age) |
+----------+
|      223 |
+----------+
1 row in set (0.01 sec)

SUM関数:SQLサンプル

条件に一致する行の合計値を取得する方法

SUMと同時にWHERE句に条件を付けることで、指定した条件に一致するレコードの値だけを合計することが出来ます。

mysql> SELECT * FROM tab1;
+--------+-----------+-------+------+
| emp_id | emp_name  | dept  | age  |
+--------+-----------+-------+------+
| 00001  | Suzuki    | HR    |   28 |
| 00002  | Tanaka    | SALES |   25 |
| 00003  | Kizaki    | SALES |   35 |
| 00004  | Takahashi | DEV   |   45 |
| 00005  | Yoshida   | DEV   |   55 |
| 00006  | Nakata    | DEV   |   35 |
+--------+-----------+-------+------+
6 rows in set (0.04 sec)

mysql> SELECT SUM(age) FROM tab1 WHERE dept = 'SALES';
+----------+
| SUM(age) |
+----------+
|       60 |
+----------+
1 row in set (0.01 sec)

複数のカラムの合計値を取得する方法

SUMを使うことでSELECTしたレコードの複数の列値を合計し、取得することが出来ます。

「SUM(列名1+列名2[,+列名3])」とすることで複数の列値を合計することが出来ます。

mysql> SELECT * FROM tab1;
+-------+------+------+
| col1  | col2 | col3 |
+-------+------+------+
| 00001 |   10 |  100 |
| 00002 |   20 |  200 |
| 00003 |   30 |  300 |
| 00001 |   40 |  400 |
| 00002 |   50 |  500 |
| 00003 |   60 |  600 |
+-------+------+------+
6 rows in set (0.00 sec)

mysql> SELECT SUM(col2 + col3) FROM tab1;
+------------------+
| SUM(col2 + col3) |
+------------------+
|             2310 |
+------------------+
1 row in set (0.00 sec)

また、次のSQLのようにGROUPBYを使ってグループ化することやWHERE句で条件を指定することも可能です。

mysql> SELECT col1,SUM(col2 + col3) FROM tab1 GROUP BY col1;
+-------+------------------+
| col1  | SUM(col2 + col3) |
+-------+------------------+
| 00001 |              550 |
| 00002 |              770 |
| 00003 |              990 |
+-------+------------------+
3 rows in set (0.00 sec)

mysql> SELECT SUM(col2 + col3) FROM tab1 WHERE col1 = '00001';
+------------------+
| SUM(col2 + col3) |
+------------------+
|              550 |
+------------------+
1 row in set (0.01 sec)

COUNT関数:件数の取得

COUNTを使うことでSELECTした結果のレコード件数を取得することが出来ます。

「COUNT(*)」とすることで、SELECTした行数を取得することが出来ます。

mysql> SELECT COUNT(*) FROM tab1;
+----------+
| COUNT(*) |
+----------+
|        6 |
+----------+
1 row in set (0.00 sec)

「COUNT(列名)」とすることで、指定した列の値の個数をカウントします。

mysql> SELECT COUNT(*) FROM tab1;
+---------------+
| COUNT(emp_id) |
+---------------+
|             6 |
+---------------+
1 row in set (0.01 sec)

前の記事

データの取得

次の記事

【MySQL】変換関数