#問題
2020年3月の注文金額が5,000円以上、かつ、ポイント割引が適応されている売上データ一覧を取得するSQL文を記述してください
という問題で、
・2020年3月以外も混ざってしまう
・割引データのないデータも抽出される
といった具合です。
データベースのカラムは
id, user, item, category, price, discount, total, orderDate
で構成されています。
データ名 | 型 | 意味 |
---|---|---|
id | int | id |
user | varchar | ユーザー名 |
item | varchar | 商品 |
category | varchar | 商品のカテゴリー |
discount | int | 値引き額 |
total | int | 注文金額 |
orderDate | date | 注文日 |
最初に実際に書いたデータが下記です。
select * from orders_scv group by discount having sum(price) >= 5000 order by orderDate between 2020-03-01 and 2020-03-31;
データベースから
having sum(price) >= 5000で、値段の合計金額が5000円以上のdiscountというカラムを抽出します。
これでいいと思ったんですけどね...。だめでした。
discountカラムには-2000などintデータが格納されますが、この場合nullも抽出されます。
後から見てみると、そりゃnullを弾いたデータはとれないよなと思いました。
あとこの時点でpriceの合計が5000円に満たないユーザーも抽出されていました。
そのユーザーの他月の注文データを確認すると、年間のトータルで5000円を超えていましたので、抽出されたのだと思います。
ということは、先に期間を設定してから、discountカラムからnullを除外すればいいのですね。
したがって書くべきコードは
between 2020-03-01 and 2020-03-31 and discount is not null;
が確定します。
残すは、5000円を超えるデータを抽出するコードを書いて、上記のコードを追加することで完成です。
select * from training2.orders where total => 5000 and between 2020-03-01 and 2020-03-31 and discount is not null;
ですね!これで解決しました。嬉しい!
久しぶりにQiitaに書き留めましたが、実際に文章にすることで問題が整理されて客観的に見れるのではと気がつきました。理解度も高まるように思えます。
理解が間違っていましたらすいません、ご指摘をいただけますと幸いです。