【MySQL】集計した値を日付けごとにグループ化して抽出する方法

タイトル通り、ログイン数の合計などの集計したいデータを日付けごとにグループ化して抽出するためのMySQLの書き方です。
これを使うことで、日ごとの投稿数とか、日ごとのログイン数がサクッととれるので、かなり重宝しています。
なお、この抽出を行うためには、数えたいカラムと日付を保存したカラムがある必要があります。

 

SQL文はこちら。

SELECT date_format([日付のカラム],'%Y%m%d'),count([カウントしたいカラム名]) FROM [テーブル名] GROUP BY date_format([日付のカラム],'%Y%m%d');

このSQL文を実行すると、カウントしたいカラムの合計値を日付けごとに抽出することができます。

今回重要なのは、GROUP BY句と、date_format() という時間関数を使うことです。
date_format()関数を使うことで、日付のデータを任意の書式に変更することができます。
今回は、「2018/04/26」のような形式に変更しています。
勿論、別の書き方でも問題ありません。

そして、その日付の値を GROUP BY でグループ化することで、同じ日付の値だけをそれぞれカウントしてくれます。
MySQLを使い始めたばかりだと、GROUP BY句ってどんな時に使うのか、そもそもどうやって使うのかの感覚がつかめなかったりするのですが、分かってしまうと凄く便利です。
日付け以外にも、カテゴリごととか、そういう指定もできますしね。

なお、上のSQL文を応用して、下記のように記述すると月ごとに集計することも可能です。

SELECT date_format([日付のカラム],'%Y%m'),count([カウントしたいカラム名]) FROM [テーブル名] GROUP BY date_format([日付のカラム],'%Y%m');

やろうと思えば時間単位でもできそうですが…それだとデータ数がとんでもないことになりそうなので、WHERE句で期間を指定するなど、計画的に行ってください。
INTO OUTFILE を使って、抽出結果を外部ファイルにエクスポートすると、後々使いやすいと思います。

 

なお、この書き方だと、カウント数が だった日付があった場合、その日は省略されますので、そこだけは注意してください。
値が 0 の日付も表示する方法はあるのかな…?
今のところ、この仕様でも困っていないのであまり意識していませんでしたが、あるなら便利そうですね。
時間があったら、方法を探してみたいと思います!

>株式会社シーポイントラボ

株式会社シーポイントラボ

TEL:053-543-9889
営業時間:9:00~18:00(月〜金)
住所:〒432-8003
   静岡県浜松市中央区和地山3-1-7
   浜松イノベーションキューブ 315
※ご来社の際はインターホンで「316」をお呼びください

CTR IMG