안녕하세요.
월별 집계쿼리를 만드던중 막히는 부분이 있어 이렇게 질문드립니다.
with a as (
select '사과' as 품종 ,'20200101' as 입고일 , '30' as 경과일, 50 as 수량 from dual
union all
select '사과' as 품종 ,'20200201' as 입고일 , '60' as 경과일, 60 as 수량 from dual
union all
select '사과' as 품종 ,'20200301' as 입고일 , '90' as 경과일, 100 as 수량 from dual
union all
select '배' as 품종 ,'20200101' as 입고일 , '30' as 경과일, 50 as 수량 from dual
union all
select '배' as 품종 ,'20200201' as 입고일 , '60' as 경과일, 100 as 수량 from dual
)
이렇게 데이터가 있을때
품종 | 총수량 | 1개월경과 | 2개월경과 | 3개월경과 | ……..조회조건에 따라 계속 증가 70이면 70개월까지 |
사과 | 210 | 50 | 60 | 100 | |
배 | 90 | 50 | 60 | 0 |
이런식으로 조회되게 하려고합니다.
제가 생각해낸 방법은 컬럼을 약 100개정도 만들어 넣고
각 컬럼별로 case 조건 걸고
(CASE
WHEN 1 <= 2 AND 2 <= 30 THEN '수량'
ELSE '0'
END as 1개월경과) // 이런식으로 100개;;
그걸 묵어서 마지막에 max치는 방법을 생각했는데
이렇게 만들면 쿼리가 너무 지저분하게되고 속도 문제도 있습니다.
이렇게 안하고 조회조건에 따라 컬럼이 동적으로 늘어나게끔 할수있을까요?
WITH a AS ( SELECT '사과' 품종, '20200101' 입고일, 30 경과일, 50 수량 FROM dual UNION ALL SELECT '사과', '20200201', 60, 60 FROM dual UNION ALL SELECT '사과', '20200301', 90, 100 FROM dual UNION ALL SELECT '배' , '20200101', 30, 50 FROM dual UNION ALL SELECT '배' , '20200201', 60, 100 FROM dual ) SELECT * FROM (SELECT 품종, 수량 , CEIL(경과일 / 30) 경과월 FROM a ) PIVOT (SUM(수량) FOR 경과월 IN (1, 2, 3)) ;