【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)