7
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

SQLデータ分析入門#8『基本的な関数を知る』

Last updated at Posted at 2018-01-05

SQLデータ分析入門#7『複数のテーブルにまたがって集計する』 - Qiita

スコープ

  • IF()が使えるようになる
  • その他の関数もなんとなく知っておく

'#5で

※ 関数とは、ある作業を勝手にやってくれる魔法の呪文、くらいに考えておいてください。

って言ってましたが、今はその理解でいいです。
本章読み終えたら、もすこし理解がすすんでいるはず。

※ 今後「hogehoge()」と書いたら、頭のなかで「hogehoge関数」と読み替えてください

IF()の仕組み

IF(条件, 条件を満たすとき, 条件を満たさないとき)

とSELECT句の中に書くと、条件に応じて違う表示をさせることができます。
なお、条件を満たすときをTRUE、そうでないときをFALSEと呼びます。

例えば

こんなテーブルがあったとき、
image.png

(前章の補足)Userテーブルに課金ユーザかどうかの情報を紐付けたい。

(Premium_UserにIDがある人を課金ユーザとします)

SELECT *
FROM
   User u
   LEFT JOIN Premium_User pu ON u.ID = pu.user_id

このように書くと、こんな集計がされて、
image.png

このような結果が返ります。
LEFT JOINでは、もし調べてくっつけるものがなかったら、nullが入ります。
image.png

これで、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が返ってくる比較演算子です。

すると、このような結果になります。
image.png

ユーザの何%が課金しているかしりたい!

もう少し進んだ集計をしてみましょう。

SELECT
   AVG(IF(pu.user_id is null, 0, 1))
FROM
   User u
   LEFT JOIN Premium_User pu ON u.ID = pu.user_id

この結果は、
image.png
と課金者比率となりますが理由はわかりましたか?
わかった方はこの先は読み飛ばしてください。わからない方はもう少し読み進めてください。

複雑なことをして集計する場合は、集計まえのテーブルのイメージを持つことが大事です。
集計前のテーブルを出力してみましょう。

SELECT
   IF(pu.user_id is null, 0, 1)
FROM
   User u
   LEFT JOIN Premium_User pu ON u.ID = pu.user_id

image.png
無課金は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

7
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?