SQL 문제풀이 복습
문제 링크
1트(7/2) 때는 CTE를 만들어서
sell과 buy 케이스를 구분한 뒤에 join해서 연산했지만
집계함수(sum)와 case when을 조합해서 쓰면 사실 그럴 필요가 없다.
SELECT stock_name,
Sum(CASE
WHEN operation = 'Sell' THEN price
end) - Sum(CASE
WHEN operation = 'Buy' THEN price
end) AS "capital_gain_loss"
FROM Stocks
GROUP BY 1;
문제 링크
join과 group by를 조합하고 subquery를 적용하면 풀 수 있는 문제.
A, B를 product_name으로 가지고 count(*)가 2 이상인 id를 뽑고
C를 product_name으로 가진 id를 뽑아서
left join으로 연결 + null 조건을 걸어서
"A와 B를 포함하고 있으면서도 C는 포함하고 있지 않은" id를 뽑는다.
그리고 Customer 테이블과 join해서 name까지 불러오면 끝.
SELECT c.customer_id,
c2.customer_name
FROM (SELECT a.customer_id
FROM (SELECT customer_id
FROM Orders
WHERE product_name IN ( 'A', 'B' )
GROUP BY 1
HAVING Count(*) >= 2) a
LEFT JOIN (SELECT customer_id
FROM Orders
WHERE product_name = 'C') b
ON a.customer_id = b.customer_id
WHERE b.customer_id IS NULL) c
JOIN Customers c2
ON c.customer_id = c2.customer_id;
문제 링크
간단한 집계 함수와 서브쿼리, 그리고 join 문제.
SELECT u.name,
Ifnull(sum, 0) AS "travelled_distance"
FROM Users u
LEFT JOIN (SELECT user_id,
Sum(distance) AS "sum"
FROM Rides
GROUP BY 1) r
ON u.id = r.user_id
ORDER BY 2 DESC,
1 ASC;