SQL 문제풀이 복습
문제 링크
1트(8/6)에서는 rank를 써서 invoice_id의 순서를 만들어 놓고
본 쿼리에서 where절을 써서 ranking = 1 조건을 적용해 해결했다.
오늘은 cte를 두 개 만든 것까지는 똑같았는데,
뽑아야 할 invoice_id를 식별하는 과정에서
min 함수를 썼기 때문에 본 쿼리의 where절에서도 서브쿼리가 하나 더 나오게 됐다.
결과물은 똑같이 나오지만 1트 때의 쿼리가 더 좋았던 것 같음.
WITH A
AS (SELECT invoice_id,
Sum(quantity * price) AS "total_price"
FROM Purchases p
JOIN Products pr
ON p.product_id = pr.product_id
GROUP BY 1),
B
AS (SELECT Min(invoice_id) AS "smallest"
FROM A
WHERE total_price = (SELECT Max(total_price)
FROM A))
SELECT p.product_id,
p.quantity,
Sum(quantity * price) AS "price"
FROM Purchases p
JOIN Products pr
ON p.product_id = pr.product_id
WHERE invoice_id = (SELECT smallest
FROM B)
GROUP BY 1;
문제 링크
그렇게 어렵지 않은 join 문제.
salesperson 전원의 total이 나와야 하므로
inner가 아니라 left join을 써야 하겠고,
join의 기준이 되는 테이블만 잘 선택하면 된다.
SELECT sp.salesperson_id,
sp.name,
IFNULL(SUM(price), 0) AS "total"
FROM Salesperson sp
LEFT JOIN Customer c
ON sp.salesperson_id = c.salesperson_id
LEFT JOIN Sales s
ON c.customer_id = s.customer_id
GROUP BY 1;
문제 링크
select와 order by 문제.
SELECT *
FROM Olympic
ORDER BY 2 DESC,
3 DESC,
4 DESC,
1 ASC;