CASE
SELECT CASE
WHEN categoryid = 1 THEN '음료'
WHEN categoryid = 2 THEN '조미료'
ELSE '기타'
END AS 'categoryName', *
FROM Products
SELECT CASE
WHEN categoryid = 1 AND SupplierID = 1 THEN '음료'
WHEN categoryid = 2 THEN '조미료'
ELSE '기타'
END AS 'categoryName', *
FROM Products
▲위의 casea문 응용버전
CategoryID별로 평균가격을 조회
SELECT CategoryID,
, AVG(Price)
FROM Products
GROUP BY CategoryID
새로 정의한 CategoryName별로 GROUP BY 조회
SELECT CASE
WHEN categoryid = 1 THEN '음료'
WHEN categoryid = 2 THEN '소스'
ELSE '기타'
END AS new_category
, AVG(Price)
FROM Products
GROUP BY new_category
▲case문을 이용해 새로운 컬럼을 생성하고 그 컬럼을 기준으로 group by 하는 경우
해커랭크 type of triangle
select case when a = b = c
then 'Equilateral'
when a <> b and b <> c
then 'Scalene'
when a = b and b <> c
else 'Not A Triangle'
end 'Not A Triangle'
from TRIANGLES
▶ case문 기준대로 잘 출력됐는지 확인하기위해 case문 옆에 *나 기준 컬럼들을 줘도 됨
▶ when 순서도 중요함
a = b or b = c or a = b 조건은 정사각형이 될 수도 있으나
정삼각형 조건을 먼저 줬기때문에 정삼각형테이터들은 이미 정삼각형으로 정의되었기때문에
아래 조건(이등변삼각형)으로 넘어가지않음
▶ a=b이지만 삼각형이 아닌 조건을 이등변삼각형 조건보다 더 앞에 써야함
CASE를 활용한 테이블 피봇팅
세로로 출력되는 것을 가로로 출력되게끔 하고싶을 때
SELECT CASE WHEN categoryid = 1
THEN price
ELSE NULL END
FROM Products
▼ categoryid 1, categoryid 2, categoryid 3의 평균가격을 구할 때
SELECT AVG(CASE WHEN categoryid = 1
THEN price
ELSE NULL END) AS category1_avg_price,
AVG(CASE WHEN categoryid = 2
THEN price
ELSE NULL END) AS category2__avg_price,
AVG(CASE WHEN categoryid = 3
THEN price
ELSE NULL END) AS category3__avg_price
FROM Products
리트코드 Reformate Department Table
leetcode.com/problems/reformat-department-table/
문제풀기 전 워밍업
이제 문제로 들어가보자
▶month = 'JAN'일 때 revenue
SELECT CASE WHEN month = 'Jan'
THEN revenue
ELSE NULL
END AS Jan_Revene
FROM department
----------결과----------
Jan_Revenue
8000
9000
null
null
null
▶각 id별로 Jan_revenue를 구하고 싶을 때
SELECT id,
SUM(CASE WHEN month = 'Jan' //id가 1인 경우 Jan예산을 조회
THEN revenue
ELSE NULL
END) AS Jan_Revene
FROM department
GROUP BY id
----------결과----------
ID Jan_Revenue
1 8000
2 9000
3 null
▶Department별 revenue 조회
SELECT id,
SUM(CASE WHEN month = 'Jan'THEN revenue ELSE NULL END) AS Jan_Revenue,
SUM(CASE WHEN month = 'Feb'THEN revenue ELSE NULL END) AS Feb_Revenue,
SUM(CASE WHEN month = 'Mar'THEN revenue ELSE NULL END) AS Mar_Revenue,
SUM(CASE WHEN month = 'Apr'THEN revenue ELSE NULL END) AS Apr_Revenue,
SUM(CASE WHEN month = 'May'THEN revenue ELSE NULL END) AS May_Revenue,
SUM(CASE WHEN month = 'Jun'THEN revenue ELSE NULL END) AS Jun_Revenue,
SUM(CASE WHEN month = 'Jul'THEN revenue ELSE NULL END) AS Jul_Revenue,
SUM(CASE WHEN month = 'Aug'THEN revenue ELSE NULL END) AS Aug_Revenue,
SUM(CASE WHEN month = 'Sep'THEN revenue ELSE NULL END) AS Sep_Revenue,
SUM(CASE WHEN month = 'Oct' THEN revenue ELSE NULL END) AS Oct_Revenue,
SUM(CASE WHEN month = 'Nov'THEN revenue ELSE NULL END) AS Nov_Revenue,
SUM(CASE WHEN month = 'Dec'THEN revenue ELSE NULL END) AS Dec_Revenue
FROM department
GROUP BY id
'Database > MySQL' 카테고리의 다른 글
SELECT (0) | 2021.05.13 |
---|---|
UNION, UNION ALL (0) | 2021.05.09 |
JOIN (0) | 2021.05.09 |
GROUP BY, HAVING절 (0) | 2021.04.28 |
집계함수 (0) | 2021.04.28 |