SQL 문제풀이 복습
문제 링크
join 활용 문제.
join의 조건으로 topping_name끼리의 대소관계를 넣으면
문제에서 요구하는 알파벳 순으로 쉽게 정렬할 수 있다.
pizza의 이름을 정하는 문자열 제어는 concat만 있으면 됨.
SELECT CONCAT(t1.topping_name, ',', t2.topping_name, ',', t3.topping_name) AS
"pizza",
t1.cost + t2.cost + t3.cost AS
"total_cost"
FROM Toppings t1
JOIN Toppings t2
ON t1.topping_name < t2.topping_name
JOIN Toppings t3
ON t2.topping_name < t3.topping_name
ORDER BY 2 DESC,
1 ASC;
SELECT candidate_id
FROM Candidates
WHERE skill IN ( 'Python', 'Tableau', 'PostgreSQL' )
GROUP BY 1
HAVING COUNT(*) >= 3
ORDER BY 1;
문제 링크
어렵지는 않은데 많이 헷갈리는 문제.
이 문제를 푸는 포인트는
not_prime에 해당하는 경우의 연산을 쉽게 할 수 있게
window함수(중 lead, lag도 상관없을 듯)를 써서
prime_eligible에 해당하는 수치들을 not_prime과 같은 행에 미리 위치시켜 놓는 것.
이걸 떠올리지 못하면 정말 해결하기 어렵고
그 뒤부터는 헷갈리는 계산만 주의하면 된다.
SELECT item_type,
CASE
WHEN item_type = 'prime_eligible' THEN cnt * Floor(500000 / sum_space)
WHEN item_type = 'not_prime' THEN Floor(
( 500000 - Floor(500000 /
lead_space)
* lead_space ) / sum_space)
* cnt
END AS "item_count"
FROM (SELECT item_type,
Sum(square_footage) AS "sum_space",
Count(DISTINCT item_id) AS "cnt",
LEAD(Sum(square_footage))
OVER(
ORDER BY item_type) AS "lead_space",
LEAD(Count(DISTINCT item_id))
OVER(
ORDER BY item_type) AS "lead_cnt"
FROM Inventory
GROUP BY 1) result
ORDER BY 2 DESC;