SQL 문제풀이 복습
문제 링크
간단한 서브쿼리 + 집계함수 활용 문제.
SELECT MAX(total_score) - MIN(total_score) AS "difference_in_score"
FROM (SELECT student_id,
assignment1 + assignment2 + assignment3 AS "total_score"
FROM Scores) result;
문제 링크
cte 만들 필요 없이 group by + having으로 바로 해결할 수 있음.
SELECT user_id
FROM Loans
WHERE loan_type IN ( 'Mortgage', 'Refinance' )
GROUP BY 1
HAVING COUNT(DISTINCT loan_type) >= 2;
문제 링크
window함수와 집계함수를 써서 연산의 기준이 되는 인라인뷰를 만들고,
거기서부터 다시 case when과 max를 조합해 피벗테이블 형태로 출력하는 문제.
원하는 포맷으로 출력하기 위해서는 concat을 써서 문자열도 제어할 줄 알아야 한다.
여러 개념을 한꺼번에 알고 써야 하는 좋은 문제!
헷갈리지 않도록 ifnull을 가장 바깥단으로 빼 주는 것만 신경쓰자.
window함수를 쓸 때 집계된 결과(sum(points)) 기준으로도
정렬할 수 있다는 것도 기억해 두기.
SELECT country,
Max(CASE
WHEN ranking = '1' THEN CONCAT(winery, " (", total_points, ")")
END) AS "top_winery",
IFNULL(Max(CASE
WHEN ranking = '2' THEN CONCAT(winery, " (", total_points,
")")
END), "No second winery") AS "second_winery",
IFNULL(Max(CASE
WHEN ranking = '3' THEN CONCAT(winery, " (", total_points,
")")
END), "No third winery") AS "third_winery"
FROM (SELECT country,
winery,
Sum(points) AS "total_points",
RANK()
OVER(
partition BY country
ORDER BY Sum(points) DESC, winery ASC) AS "ranking"
FROM Wineries
GROUP BY 1,
2) result
GROUP BY 1
ORDER BY 1;