프로그래밍/Sqlite

[Sqlite] case문을 이용해서 여러개의 열 만들기

*%$@$#@ 2023. 1. 11.
728x90
반응형

CASE문은 한 번에 한 개의 열 밖에는 리턴할 수 없습니다.

가령 매달의 판매기록을 저장하고 있는 테이블이 있고 이를 각 연도별로 월마다의 매출 기록을 비교하고 싶은 상황을 가정해 봅시다.

sales_month  | sales
1992-01-01  | 790
1992-02-01  | 539
1992-03-01  | 535
...
1993-01-01  | 998
1993-02-01  | 568
1993-03-01  | 602
...

이 경우에 먼저 sales_month에서 달에 해당하는 정보를 추출하여 group by를 이용해 묶어줘야 합니다.

또한 case문을 통해서 sales_month에서의 연도 정보를 추출하고 년도값에 따라서 다른 열에 값을 분배하도록 해야 합니다. 다음과 같이 시도해 볼 수 있습니다.


SELECT strftime('%m', sales_month) as month_number
,(case when strftime('%Y', sales_month) = '1992' then sales end) as sales_1992
,(case when strftime('%Y', sales_month) = '1993' then sales end) as sales_1993
,(case when strftime('%Y', sales_month) = '1994' then sales end) as sales_1994
FROM sales
GROUP BY 1
;


문법상 문제없어 보이는 코드이지만 결과를 출력해 보면 sales_1992 열을 제외하고는 모두 null값을 가집니다.

month_number  |  sales_1992  | sales_1993  |  sales_1994
01  |  790  |  null  |  null
02  |  539  |  null  |  null
03  |  535  |  null  |  null

이때, 각각의 case문 앞에 max 함수를 붙여주면 각 열의 결과가 모두 잘 나타나는 것을 확인할 수 있습니다.


SELECT strftime('%m', sales_month) as month_number
,max(case when strftime('%Y', sales_month) = '1992' then sales end) as sales_1992
,max(case when strftime('%Y', sales_month) = '1993' then sales end) as sales_1993
,max(case when strftime('%Y', sales_month) = '1994' then sales end) as sales_1994
FROM sales
GROUP BY 1
;


month_number  |  sales_1992  | sales_1993  |  sales_1994
01  |  790  |  998  |  1053
02  |  539  |  568  |  635
03  |  535  |  602  |  634





728x90
반응형

댓글