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

[SQLデータ分析入門#7『複数のテーブルにまたがって集計する』 - Qiita](https://qiita.com/piyoSakai/items/84bd688b4e4db2148193)

# スコープ
- IF()が使えるようになる
- その他の関数もなんとなく知っておく

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

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

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

# IF()の仕組み

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

# 例えば
こんなテーブルがあったとき、
![image.png](https://qiita-image-store.s3.amazonaws.com/0/214098/048b026f-5761-afd4-b664-52ebaa0f9f17.png)

## (前章の補足)Userテーブルに課金ユーザかどうかの情報を紐付けたい。
(Premium_UserにIDがある人を課金ユーザとします)

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

このように書くと、こんな集計がされて、
![image.png](https://qiita-image-store.s3.amazonaws.com/0/214098/8b4cf427-b658-543c-6526-a74fe2b74c77.png)

このような結果が返ります。
LEFT JOINでは、もし調べてくっつけるものがなかったら、nullが入ります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/214098/f26ef529-08ea-e420-4b93-2d1dbd8a8d47.png)

これで、**nullじゃない人**が課金ユーザとわかるのですが、ちょっと汚いですよね。
これをIF()を使って解決します。

## 【きれいに！】Userテーブルに課金ユーザかどうかの情報を紐付けたい。
```SQL
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](https://qiita-image-store.s3.amazonaws.com/0/214098/09f6911f-9c8f-9996-e471-b24c023b0777.png)

## ユーザの何％が課金しているかしりたい！
もう少し進んだ集計をしてみましょう。

```SQL
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](https://qiita-image-store.s3.amazonaws.com/0/214098/a689b5f1-f86f-b979-05c8-2e769574d844.png)
と課金者比率となりますが理由はわかりましたか？
わかった方はこの先は読み飛ばしてください。わからない方はもう少し読み進めてください。

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

```SQL
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](https://qiita-image-store.s3.amazonaws.com/0/214098/877f0c06-f113-a2a7-f67e-9ee7c03d1b10.png)
無課金は0、課金は1が入ったテーブルができています。
このとき、課金者の比率を計算したければ、4人/9人=44%ですね。
では、IF(…)を平均する数式はどうでしょう。同様に4/9=44%となります。
そこで、IF(…)をAVG()でくくってあげて最初のSQLを書いたわけです。
マジックのような集計ですが、比較的便利でよく使うのでぜひ覚えておいてください。

# その他のよく使う関数など

この記事も良さそう
[【初級編⑦】SQLのSELECT文で関数を使いこなす | SQLServer2008虎の巻](https://kaya-soft.com/sqlserver2008-toranomaki/beginner/function/)

### DATE_FORMAT(タイムスタンプ, 日付形式) 
例えば、```DATE_FORMAT('2018-01-05 12:34:56', '%Y/%m')```というデータであれば、
```2018-01```と年月だけになります。
月ごとの集計をする際などに便利な関数です。

### CASE WHEN ～ ELSE ～ END
条件分岐が多い場合、IF()で書くと非常に読みにくくなります。
そういうときはCASE式がおすすめです。

IFの代わりにこのように書きます。詳しくは調べてください。

```SQL
CASE
   WHEN hoge = 1  then "イチ"
   WHEN hoge >= 2 then "二いじょう"
   ELSE "ゼロいか"
END
```

### RIGHT(なんか)
右1文字をとってきます。
下一桁が1~5のユーザについて集計したい、といったときにおすすめです。

なお、```RIGHT(なんか, 持ってきたい文字数)```とすると、任意の文字数を取得できます。


# 推薦図書
よくあるSQL本はエンジニア向けなのですが、この本は分析をしたいだけの人に向いてます。
<a href="https://www.amazon.co.jp/10%E5%B9%B4%E6%88%A6%E3%81%88%E3%82%8B%E3%83%87%E3%83%BC%E3%82%BF%E5%88%86%E6%9E%90%E5%85%A5%E9%96%80-SQL%E3%82%92%E6%AD%A6%E5%99%A8%E3%81%AB%E3%83%87%E3%83%BC%E3%82%BF%E6%B4%BB%E7%94%A8%E6%99%82%E4%BB%A3%E3%82%92%E7%94%9F%E3%81%8D%E6%8A%9C%E3%81%8F-Informatics-IDEA-%E9%9D%92%E6%9C%A8/dp/4797376279/ref=as_li_ss_il?ie=UTF8&qid=1529821989&sr=8-1&keywords=10%E5%B9%B4%E6%88%A6%E3%81%88%E3%82%8B%E3%83%87%E3%83%BC%E3%82%BF%E5%88%86%E6%9E%90%E5%85%A5%E9%96%80&linkCode=li2&tag=t11378rs0f-22&linkId=904d97de322a8c31a37e518e1ef2a7a8" target="_blank"><img border="0" src="//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&ASIN=4797376279&Format=_SL160_&ID=AsinImage&MarketPlace=JP&ServiceVersion=20070822&WS=1&tag=t11378rs0f-22" ></a><img src="https://ir-jp.amazon-adsystem.com/e/ir?t=t11378rs0f-22&l=li2&o=9&a=4797376279" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />

# 前後の記事
[SQLデータ分析入門#1『SQLってなんだ』 - Qiita](https://qiita.com/piyoSakai/items/926b8f46b08c4a9d439a)
[SQLデータ分析入門#2『SELECT ~ FROM ~ を理解する』 - Qiita](https://qiita.com/piyoSakai/items/b001eac8e0981244be39)
[SQLデータ分析入門#3『WHERE句を理解する』 - Qiita](https://qiita.com/piyoSakai/items/44bc21178349103e2d45)
[SQLデータ分析入門#4『LIMIT句を理解する』 - Qiita](https://qiita.com/piyoSakai/items/131553cbc40ac357477f)
[SQLデータ分析入門#5『集計関数を理解する』 - Qiita](https://qiita.com/piyoSakai/items/16214cd50e28386c97ed)
[SQLデータ分析入門#6『結果の順番をいい感じにする』 - Qiita](https://qiita.com/piyoSakai/items/6008c62a88554a44eb2a)
[SQLデータ分析入門#7『複数のテーブルにまたがって集計する』 - Qiita](https://qiita.com/piyoSakai/items/84bd688b4e4db2148193)
[SQLデータ分析入門#8『基本的な関数を知る』 - Qiita](https://qiita.com/piyoSakai/items/f79869a5b60ab7e8c3b2)