본문 바로가기
Database/MySQL

CASE문

by 서초록 2021. 5. 9.

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/

 

Reformat Department Table - LeetCode

Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.

leetcode.com

문제풀기 전 워밍업

이제 문제로 들어가보자

▶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