【MySQL】月・年代(世代)ごとに集計する方法
ここではMySQLで、月・年代(世代)ごとに集計する方法を紹介しています。
月ごとに集計する方法
月ごとにレコードを集計するには、DATE_FORMAT関数とGROUPBY句を合わせて使います。
まずテーブルを用意します。今回はCOL2列にDATE型を指定しています。
CREATE TABLE tab2(
col1 varchar(10)
,col2 DATE
,col3 int
);
準備したテーブルにデータを登録しておきます。
mysql> SELECT * FROM tab2;
+-------+------------+------+
| col1 | col2 | col3 |
+-------+------------+------+
| 00001 | 2010-10-01 | 100 |
| 00002 | 2010-11-01 | 100 |
| 00003 | 2010-11-01 | 100 |
| 00004 | 2010-12-01 | 100 |
| 00005 | 2010-12-01 | 100 |
| 00006 | 2011-01-01 | 100 |
+-------+------------+------+
6 rows in set (0.00 sec)
DATE_FORMAT関数とGROUPBY句を使って、月ごとに集計するSQLです。
DATE_FORMAT関数で書式に「’%Y%m’」として、年月を指定しています。そしてGROUP BY句で年月で集計するように指定しています。
SELECT
DATE_FORMAT(col2, '%Y%m') as YM
,SUM(col3)
FROM
tab2
GROUP BY
DATE_FORMAT(col2, '%Y%m')
;
SQLを実行すると次のような結果になります。
mysql> SELECT DATE_FORMAT(col2, '%Y%m') as YM ,SUM(col3) FROM tab2 GROUP BY DATE_FORMAT(col2,'%Y%m');
+--------+-----------+
| YM | SUM(col3) |
+--------+-----------+
| 201010 | 100 |
| 201011 | 200 |
| 201012 | 200 |
| 201101 | 100 |
+--------+-----------+
4 rows in set (0.00 sec)
月ごとにレコード件数を取得したい場合はCOUNT関数を組み合わせます。
mysql> SELECT DATE_FORMAT(col2, '%Y%m') as YM ,COUNT(*) FROM tab2 GROUP BY DATE_FORMAT(col2,'%Y%m');
+--------+----------+
| YM | COUNT(*) |
+--------+----------+
| 201010 | 1 |
| 201011 | 2 |
| 201012 | 2 |
| 201101 | 1 |
+--------+----------+
4 rows in set (0.00 sec)
年代(世代)ごとに集計する方法
年代・世代ごとに集計する方法の1つとして、CASE文を使う方法があります。
次のSQLでは、CASE文を使ってAGE列を年代別・世代別にグループとしてまとめて集計しています。
SELECT
CASE
WHEN age < 10 THEN '10歳未満'
WHEN age <= 19 THEN '10代'
WHEN age <= 29 THEN '20代'
WHEN age <= 39 THEN '30代'
WHEN age <= 49 THEN '40代'
WHEN age <= 59 THEN '50代'
WHEN age <= 69 THEN '60代'
WHEN age >= 70 THEN '70歳以上'
END as age_g
,count(1)
FROM
tab1
GROUP BY
age_g
;
データは次の通りです。
mysql> SELECT emp_name,age FROM tab1;
+-----------+------+
| emp_name | age |
+-----------+------+
| Suzuki | 28 |
| Tanaka | 25 |
| Kizaki | 35 |
| Takahashi | 45 |
| Yoshida | 55 |
| Nakata | 35 |
+-----------+------+
6 rows in set (0.01 sec)
先ほどのSQLを実行した結果はこちらです。年代別に集計されています。
+-------+----------+
| age_g | count(1) |
+-------+----------+
| 20代 | 2 |
| 30代 | 2 |
| 40代 | 1 |
| 50代 | 1 |
+-------+----------+
4 rows in set (0.00 sec)