Yuki's Tech Blog

仕事で得た知見や勉強した技術を書きます。

leet codeのSQL問題を1日1題解く【1581. Customer Who Visited but Did Not Make Any Transactions】

目次

初めに

今日もSQLの問題を解いて行きます。

問題

leetcode.com

セットアップ

以下のSQL文をローカル環境で実行します。

Create table If Not Exists Visits(visit_id int, customer_id int);
Create table If Not Exists Transactions(transaction_id int, visit_id int, amount int);
Truncate table Visits;
insert into Visits (visit_id, customer_id) values ('1', '23');
insert into Visits (visit_id, customer_id) values ('2', '9');
insert into Visits (visit_id, customer_id) values ('4', '30');
insert into Visits (visit_id, customer_id) values ('5', '54');
insert into Visits (visit_id, customer_id) values ('6', '96');
insert into Visits (visit_id, customer_id) values ('7', '54');
insert into Visits (visit_id, customer_id) values ('8', '54');
Truncate table Transactions;
insert into Transactions (transaction_id, visit_id, amount) values ('2', '5', '310');
insert into Transactions (transaction_id, visit_id, amount) values ('3', '5', '300');
insert into Transactions (transaction_id, visit_id, amount) values ('9', '5', '200');
insert into Transactions (transaction_id, visit_id, amount) values ('12', '1', '910');
insert into Transactions (transaction_id, visit_id, amount) values ('13', '2', '970');

知らなかった or 理解があやふやな知識

COUNTとGROUP BYの併用

COUNTとGROUP BYを併用することで、グループごとのレコード数をカウントすることができます。

www.w3schools.com

FROM > ON > JOIN > WHERE > GROUP BYの順番で評価される

WHEREがGROUP BYより上にあるのも、グループ化させるよりも前にWHEREの条件を適用させた方が、考慮すべき行数が減るので、WHEREの後にGROUP BYが実行されるのもなんとなく理解できます。

yukihaga.hatenablog.com

パフォーマンスや得られる結果を考慮すると、この順序になるのは自然なのかなと感覚で理解できます。

解答

こちらのSQLを実行したら、以下のような結果が取得できました。 LEFT OUTER JOINすることで、トランザクションを持っていない顧客も結合後のテーブルに表示させることができました。

SELECT *
FROM Visits AS V
LEFT OUTER JOIN Transactions AS T
ON V.visit_id = T.visit_id

Image from Gyazo

以下のSQL文を実行したら、無事クリアできました。

SELECT V.customer_id, COUNT(*) AS count_no_trans
FROM Visits AS V
LEFT OUTER JOIN Transactions AS T
ON V.visit_id = T.visit_id
WHERE T.transaction_id IS NULL
GROUP BY V.customer_id

終わり

明日もやります!

参考記事