241117_TIL

J Lee·2024년 11월 17일
0

아무리 사소하더라도 배움이 없는 날은 없다.

SQL 문제풀이 복습


Leetcode

문제 링크
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;
profile
기본기를 소홀히 하지 말자

0개의 댓글

관련 채용 정보