背景
group by に関わるイメージをもっと具体的にしたいと思い、
例題にトライ
目的
例題を見て下記がわかるようになること
- group by が必要なところ
- havingが必要なところ
例題1
下記の部屋番号から、利用日数が10日以上の部屋を選択するSQLを作成する。
利用履歴テーブル
部屋番号 | 利用開始日 | 利用終了日 |
---|---|---|
--- | --- | --- |
101 | 24-09-05 | 24-09-08 |
101 | 24-09-10 | 24-09-11 |
101 | 24-09-13 | 24-09-19 |
--- | --- | --- |
201 | 24-09-05 | 24-09-08 |
201 | 24-09-09 | 14-09-10 |
完成予想テーブル
部屋番号 | 日数 |
---|---|
101 | 10 |
自分が書いた誤った回答
201 nullで表示されてしまうため間違い。
as も抜けている。
SELECT 部屋番号
CASE WHEN SUM(利用終了日-利用開始日)>=10 then SUM(利用終了日-利用開始日) ELSE NULL END
FROM 利用履歴テーブル
GROUP BY 部屋番号
正解
SELECT 部屋番号,SUM(利用終了日-利用開始日) AS 日数
FROM 利用履歴テーブル
GROUP BY 部屋番号
HAVING SUM(利用終了日-利用開始日)>=10
学び
最近case whenを学んだことで、
いらんところにcase文を使ってしまった。
今回の間違えによって下記を学んだ
- select内にcase文を書くだけだと、集約キーを全て表示する。
- havingを使用することで条件に満たない、集約キーのレコードは削除する。
※集約キーとは、group by 〇〇 に指定したキーのこと
次のステップ
case文はもう少し練習が必要そう。。。