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