TIL - 250429_(SQL_datalemur_2개)

오정수·2025년 4월 29일

TIL

목록 보기
64/78

문제1 (링크)

WITH a AS (
  SELECT *
  FROM advertiser
  LEFT JOIN daily_pay
  USING (user_id)
  UNION
  SELECT *
  FROM advertiser
  RIGHT JOIN daily_pay
  USING (user_id)
)
SELECT 
  user_id
  , CASE 
  WHEN paid IS NULL THEN 'CHURN'
  WHEN paid IS NOT NULL AND status in ('NEW','EXISTING','RESURRECT') THEN 'EXISTING'
  WHEN paid IS NOT NULL AND status = 'CHURN' THEN 'RESURRECT'
  WHEN paid IS NOT NULL AND status IS NULL THEN 'NEW'
  END AS new_status
FROM a
ORDER BY user_id

비고 : 지원하는 언어인 PostgreSQL에서는 OUTER JOIN을 지원하지 않는 거 같다. 그래서 LEFT JOIN과 RIGHT JOIN을 UNION으로 병합 후에 조건에 따라 변경했다.

문제2 (링크)

SELECT 
  CONCAT(p1.topping_name,',',p2.topping_name,',',p3.topping_name) AS pizza
  , p1.ingredient_cost+p2.ingredient_cost+p3.ingredient_cost AS total_cost
FROM pizza_toppings p1, pizza_toppings p2, pizza_toppings p3
WHERE p1.topping_name < p2.topping_name 
AND p2.topping_name < p3.topping_name
ORDER BY total_cost DESC

비고 : FROM절에 1, 2, 3 테이블을 하면 셀프 조인이 가능하다. WHERE절에 부등호로 중복을 제거했다. SQL에서는 부등호로 문자를 비교할 수 있다. 기준은 사전식 정렬이다. 예를 들어 apple < banana인 셈이다.

profile
안녕하세요 오정수입니다

0개의 댓글