0
0

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 3 years have passed since last update.

SQLのデータのソートって記述する順番が大事ですね【備忘】

Posted at

#問題
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に書き留めましたが、実際に文章にすることで問題が整理されて客観的に見れるのではと気がつきました。理解度も高まるように思えます。

理解が間違っていましたらすいません、ご指摘をいただけますと幸いです。

0
0
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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?