tak's data blog
LeetCode 문제풀이 (1393, 1407, 1484, 1581) 본문
#1393
SELECT stock_name,
SUM( CASE WHEN operation = 'Buy' THEN -price
ELSE price END) AS 'capital_gain_loss'
FROM Stocks
GROUP BY stock_name
물품별 총 판매 + 구매 가격을 구하는 문제이다. case when으로 조건을 주어 총합을 구할 수 있었다.
아래는 일부러 꼬아서 with문을 통해 판매한 물품 테이블, 구매한 물품 테이블을 따로 구해서 합을 구한 방법이다.
아래의 방법은 추후에 어려운 문제들이 나오고 테이블 생성이 필요할 때 언젠가 쓰이지 않을까 생각해보았다.
# Write your MySQL query statement below
WITH MINUS AS (SELECT stock_name, operation, sum(-price) as m_price
FROM Stocks
WHERE operation = 'Buy'
GROUP BY stock_name)
SELECT s.stock_name, sum(s.price) + m.m_price as 'capital_gain_loss'
FROM stocks s
join
MINUS m on s.stock_name = m.stock_name
WHERE s.operation = 'Sell'
GROUP BY s.stock_name
#1407
이 문제는 Users 테이블에는 있고, Rides 테이블에는 없는 행에대한 값도 구해야 하므로 left join이 핵심이라고 생각한다.
처음 join을 했다가 왜 안되지?라고 고민해보니 Rides에 없는 정보도 구해야했어서 오류가 발생했었다.
SELECT u.name,
ifnull(sum(r.distance), 0) as 'travelled_distance'
FROM Users u
left join
Rides r on u.id = r.user_id
GROUP BY r.user_id
ORDER BY travelled_distance desc, u.name asc;
#1484
SELECT
sell_date,
count(distinct product) as num_sold,
group_CONCAT(distinct product order by product) as products
from Activities
group by sell_date
order by sell_date;
이 문제는 아래와 같이 ,단위로 물품들을 묶는 문제인데 이 문제가 은근 자주 쓰일 수 있는 것 같아서 group_CONCAT 꼭 숙지해야겠다.
#1581
SELECT v.customer_id,
count(customer_id) as 'count_no_trans'
FROM Visits v
left join
Transactions t on v.visit_id = t.visit_id
WHERE t.amount is null
GROUP BY customer_id
ORDER BY count_no_trans
customer_id에서 amount 값이 null인 값들의 count를 구하는 문제이다. 순간 where에 is null이란 조건을 잊어먹고 case when이나 ifnull로 풀어보려고 했었다. 이 두부분도 잘쓰면 가능할 것 같다.
'SQL' 카테고리의 다른 글
리트코드 SQL 50 (0) | 2024.04.09 |
---|---|
LeetCode 문제풀이 (1795) (0) | 2022.07.04 |
LeetCode 문제풀이 (626, 1158) (0) | 2022.06.27 |
LeetCode 문제풀이 (262) (0) | 2022.06.26 |
LeetCode 문제풀이 (184, 185) (0) | 2022.06.26 |