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
'프로그래밍 > Sqlite' 카테고리의 다른 글
[Sqlite] YoY, MoM, DoD 분석하기 (0) | 2023.01.10 |
---|---|
[Sqlite] 날짜 차원(Date Dimension) 테이블 만들기 (0) | 2023.01.06 |
[Sqlite] 이동평균(moving avg) 계산하기 (2) | 2023.01.06 |
[sqlite] date_part 기능 사용하기 (0) | 2023.01.05 |
[sqlite] csv로부터 데이터베이스 만들기(windows) (0) | 2023.01.05 |
댓글