241007_TIL

J Lee·2024년 10월 6일

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

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

0개의 댓글