MySLQで(ジャンル別とかの)集計をしたい
2017-07-06 | カテゴリ >> サーバー小ネタ(Linux)

そして集計時のグルーピングを日本語表記にしたい。

例えば、DBのUserテーブルにgenderカラムがあって、男女別のレコードを集計したい時とかは

mysql> select gender, count(gender) from users group by gender;
+--------+---------------+
| gender | count(gender) |
+--------+---------------+
|      1 |           221 |
|      2 |            42 |
+--------+---------------+
2 rows in set (0.00 sec)

とかで済む。

けれども、男女だけならOKなんですが都道府県をIDで保存してたりして 集計をredashで表示する時
ぐぬぬ。。。

ってなった。

調べたら case という構文が使える事がわかったので、ほぼ自分用メモエントリ。

しかも、カテゴリ名に日本語とかマルチバイトも使えるらしくて便利じゃんね。

男女集計の場合

case gender として、then で使いたい文字列を任意に決めれる。
カテゴリ名は end as “hogehoge” として指定。 簡単。

mysql> select
    -> case gender
    ->     when 1 then '男'
    ->     when 2 then '女'
    -> end as '性別',
    -> count(gender)
    -> from users
    -> group by gender;
+--------+---------------+
| 性別   | count(gender) |
+--------+---------------+
| 男     |           221 |
| 女     |            42 |
+--------+---------------+
2 rows in set (0.00 sec)

これの応用で、都道府県とかでもできるけど
例えば年齢を年代別に集計したい時、when でもっと高度なことができる事を汁。 知る。

あぁ〜 美味しいこってりしたラーメンのるーしー 飲みたいなぁ。
(2017年7月 現在減量中…)

年齢を年代別に集計する

mysql> select
    ->   case
    ->     when age < 19 then '19以下'
    ->     when age between 20 and 29 then 20
    ->     when age between 30 and 39 then 30
    ->     when age between 40 and 49 then 40
    ->     when age between 50 and 59 then 50
    ->     when age >= 60 then '60以上'
    ->     else '定年'
    ->   end as `世代`,
    ->   count(*) as `人数`
    -> from (select year(curdate()) - year(birthday) - (right(curdate(),5) < right(birthday,5)) as age from users) t1 group by `世代`;
+----------+--------+
| 世代     | 人数   |
+----------+--------+
| 19以下   |      2 |
| 20       |     29 |
| 30       |     83 |
| 40       |     52 |
| 50       |     78 | 
| 60以上   |     20 |
+----------+--------+
6 rows in set (0.00 sec)

というわけ。

これでredashが加速する。。
おわり。
 
 

Share on FacebookShare on Google+Tweet about this on TwitterShare on LinkedIn
2017-07-06 | カテゴリ >> サーバー小ネタ(Linux) 

関連記事

Comment





Comment



*