SQLデータ分析入門#7『複数のテーブルにまたがって集計する』 - Qiita
スコープ
- IF()が使えるようになる
- その他の関数もなんとなく知っておく
'#5で
※ 関数とは、ある作業を勝手にやってくれる魔法の呪文、くらいに考えておいてください。
って言ってましたが、今はその理解でいいです。
本章読み終えたら、もすこし理解がすすんでいるはず。
※ 今後「hogehoge()」と書いたら、頭のなかで「hogehoge関数」と読み替えてください
IF()の仕組み
IF(条件, 条件を満たすとき, 条件を満たさないとき)
とSELECT句の中に書くと、条件に応じて違う表示をさせることができます。
なお、条件を満たすときをTRUE、そうでないときをFALSEと呼びます。
例えば
(前章の補足)Userテーブルに課金ユーザかどうかの情報を紐付けたい。
(Premium_UserにIDがある人を課金ユーザとします)
SELECT *
FROM
User u
LEFT JOIN Premium_User pu ON u.ID = pu.user_id
このような結果が返ります。
LEFT JOINでは、もし調べてくっつけるものがなかったら、nullが入ります。
これで、nullじゃない人が課金ユーザとわかるのですが、ちょっと汚いですよね。
これをIF()を使って解決します。
【きれいに!】Userテーブルに課金ユーザかどうかの情報を紐付けたい。
SELECT
u.id
, IF(pu.user_id is null, "無課金", "課金")
FROM
User u
LEFT JOIN Premium_User pu ON u.ID = pu.user_id
~ is nullは、~がnullのときにTRUE、そうでないときにFALSEが返ってくる比較演算子です。
ユーザの何%が課金しているかしりたい!
もう少し進んだ集計をしてみましょう。
SELECT
AVG(IF(pu.user_id is null, 0, 1))
FROM
User u
LEFT JOIN Premium_User pu ON u.ID = pu.user_id
この結果は、
と課金者比率となりますが理由はわかりましたか?
わかった方はこの先は読み飛ばしてください。わからない方はもう少し読み進めてください。
複雑なことをして集計する場合は、集計まえのテーブルのイメージを持つことが大事です。
集計前のテーブルを出力してみましょう。
SELECT
IF(pu.user_id is null, 0, 1)
FROM
User u
LEFT JOIN Premium_User pu ON u.ID = pu.user_id
無課金は0、課金は1が入ったテーブルができています。
このとき、課金者の比率を計算したければ、4人/9人=44%ですね。
では、IF(…)を平均する数式はどうでしょう。同様に4/9=44%となります。
そこで、IF(…)をAVG()でくくってあげて最初のSQLを書いたわけです。
マジックのような集計ですが、比較的便利でよく使うのでぜひ覚えておいてください。
その他のよく使う関数など
この記事も良さそう
【初級編⑦】SQLのSELECT文で関数を使いこなす | SQLServer2008虎の巻
DATE_FORMAT(タイムスタンプ, 日付形式)
例えば、DATE_FORMAT('2018-01-05 12:34:56', '%Y/%m')
というデータであれば、
2018-01
と年月だけになります。
月ごとの集計をする際などに便利な関数です。
CASE WHEN ~ ELSE ~ END
条件分岐が多い場合、IF()で書くと非常に読みにくくなります。
そういうときはCASE式がおすすめです。
IFの代わりにこのように書きます。詳しくは調べてください。
CASE
WHEN hoge = 1 then "イチ"
WHEN hoge >= 2 then "二いじょう"
ELSE "ゼロいか"
END
RIGHT(なんか)
右1文字をとってきます。
下一桁が1~5のユーザについて集計したい、といったときにおすすめです。
なお、RIGHT(なんか, 持ってきたい文字数)
とすると、任意の文字数を取得できます。
推薦図書
よくあるSQL本はエンジニア向けなのですが、この本は分析をしたいだけの人に向いてます。
前後の記事
SQLデータ分析入門#1『SQLってなんだ』 - Qiita
SQLデータ分析入門#2『SELECT ~ FROM ~ を理解する』 - Qiita
SQLデータ分析入門#3『WHERE句を理解する』 - Qiita
SQLデータ分析入門#4『LIMIT句を理解する』 - Qiita
SQLデータ分析入門#5『集計関数を理解する』 - Qiita
SQLデータ分析入門#6『結果の順番をいい感じにする』 - Qiita
SQLデータ分析入門#7『複数のテーブルにまたがって集計する』 - Qiita
SQLデータ分析入門#8『基本的な関数を知る』 - Qiita