tak's data blog

LeetCode 문제풀이 (1393, 1407, 1484, 1581) 본문

SQL

LeetCode 문제풀이 (1393, 1407, 1484, 1581)

hyuntaek 2022. 7. 1. 23:29
반응형
SMALL

 

 

#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로 풀어보려고 했었다. 이 두부분도 잘쓰면 가능할 것 같다.

반응형
LIST

'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