영국 척척석사 유학생 일기장👩🏻‍🎓

(SQL) CASE 문 개념 및 연습문제 본문

코딩공부/SQL

(SQL) CASE 문 개념 및 연습문제

life-of-nomad 2024. 5. 13. 14:06
728x90
반응형

1) CASE

  • CASE 문은 항상 SELECT 절에 써야 함
  • CASE는 WHERE, THEN, END 구성요소를 포함해야함
  • ELSE는 다른 CASE 조건을 충족하지 않는 경우를 위한 선택적 구성 요소
  • WHEN 사이에 조건 연산자 (WHERE) 를 사용하여 조건문 만들 수 있음 (AND, OR 사용 가능)
  • 예시 
SELECT id, account_id, occurred_at, channel, 
CASE WHEN channel = 'facebook' OR channel = 'direct' THEN 'yes'
ELSE 'no' END AS is_facebook
FROM web_events
ORDER BY occurred_at

 

SELECT account_id, occurred_at, total,
CASE WHEN total > 500 THEN 'Over 500'
WHEN total > 300 AND total <= 500 THEN '301-500'
WHEN total > 100 AND total <= 300 THEN '101-300'
ELSE '100 or under' END AS total_group
FROM orders

 

2) 연습문제

Schema

  • 각 주문의 'total' 항목 수를 기준으로 세 범주 각각의 주문 수를 표시하는 쿼리를 작성합니다. 세 가지 범주는 '2000 이상', '1000 ~ 2000 사이' 및 '1000 이하'입니다.
SELECT CASE WHEN total >= 2000 THEN 'At least 2000'
WHEN total >= 1000 AND total < 2000 THEN 'Between 1000 and 2000'
ELSE 'Less than 1000' END AS order_category,
COUNT(*) AS order_count
FROM orders
GROUP BY 1

 

  • 구매와 관련된 금액을 기준으로 고객의 3가지 수준을 이해하려고 합니다. 최상위에는 모든 주문의 총 판매액이 '200,000' USD 이상인 모든 인원이 포함됩니다. 두 번째 수준은 '200,000~100,000' USD 사이입니다. 최저 수준은 '100,000' USD 이하인 경우입니다. 각 account와 연결된 level이 포함된 테이블을 제공하십시오. account name, 고객의 total sales of all orders  level을 제공해야 합니다. 가장 많이 지출하는 고객이 먼저 나열된 순서로 정렬하십시오.
SELECT a.name, SUM(total_amt_usd) total_spent,
CASE WHEN SUM(total_amt_usd) > 200000 THEN 'top'
WHEN SUM(total_amt_usd) > 100000 THEN 'middle'
ELSE 'low' END AS customer_level
FROM orders o
JOIN accounts a
ON o.account_id = a.id
GROUP BY 1
ORDER BY 2 DESC;

 

  • 위의 문제와 동일한 조건에서  '2016' 및 '2017'에만 고객이 지출한 총 금액을 구하려고 합니다. 가장 많이 지출하는 고객이 먼저 나열된 순서로 정렬하십시오.
SELECT a.name, SUM(total_amt_usd) total_spent,
CASE WHEN SUM(total_amt_usd) > 200000 THEN 'top'
WHEN  SUM(total_amt_usd) > 100000 THEN 'middle'
ELSE 'low' END AS customer_level
FROM orders o
JOIN accounts a
ON o.account_id = a.id
WHERE occurred_at > '2015-12-31'
GROUP BY 1
ORDER BY 2 DESC;

728x90
반응형