SELECT DECODE(J.SUBTIME,
'00',
'00:00~01:00',
'01',
'01:00~02:00',
'02',
'02:00~03:00',
'03',
'03:00~04:00',
'04',
'04:00~05:00',
'05',
'05:00~06:00',
'06',
'06:00~07:00',
'07',
'07:00~08:00',
'08',
'08:00~09:00',
'09',
'09:00~10:00',
'10',
'10:00~11:00',
'11',
'11:00~12:00',
'12',
'12:00~13:00',
'13',
'13:00~14:00',
'14',
'14:00~15:00',
'15',
'15:00~16:00',
'16',
'16:00~17:00',
'17',
'17:00~18:00',
'18',
'18:00~19:00',
'19',
'19:00~20:00',
'20',
'20:00~21:00',
'21',
'21:00~22:00',
'22',
'22:00~23:00',
'23',
'23:00~00:00'),
J.A-LINE04,
J.B-LINE04,
J.C-LINE04,
J.D-LINE04
FROM (SELECT *
FROM (SELECT SUBTIME, LINE, SUM(QTY) AS PANLQTY
FROM T1
GROUP BY SUBTIME, LINE
ORDER BY LINE_ID)
PIVOT(SUM(PANLQTY)
FOR LINE IN('A-LINE04' AS A-LINE04,
'B-LINE04' AS B-LINE04,
'C-LINE04' AS C-LINE04,
'D-LINE13' AS D-LINE04))
ORDER BY SUBTIME) J
FOR LINE IN 값을 동적으로 넣고 싶은데 어떻게 방식으로 해야 할지 모르겠습니다.
예: A-LINE04, A-LINE05, A-LINE06 더 늘어 날수도 있습니다.
(시간별 라인 현재 WIP 쿼리 입니다.)
도움 부탁 드립니다.
1. 정적SQL 에서 동적 컬럼 구현은 안됩니다.
- 동적SQL로 구현해야 합니다.
- PIVOT XML 을 사용하면 서브쿼리형태로 IN 절을 사용 할 수는 있지만 결과가 테이블 형태가 아닌 XML 형태가 나올 것입니다.
2. 쿼리 개선
- 불필요한 Group by 및 Order by 구문 제거
- Decode 구문 간소화
SELECT * FROM (SELECT subtime||':00~'||LPAD(MOD(subtime+1, 24), 2, '0')||':00' subtime , line , qty FROM t1 ) PIVOT (SUM(qty) FOR line IN ( 'A-LINE04' AS a-line04 , 'B-LINE04' AS b-line04 , 'C-LINE04' AS c-line04 , 'D-LINE13' AS d-line04 ) ) ORDER BY subtime ;
-- PIVOT XML 방식 SELECT * FROM (SELECT subtime||':00~'||LPAD(MOD(subtime+1, 24), 2, '0')||':00' subtime , line , qty FROM t1 ) PIVOT XML (SUM(qty) FOR line IN (SELECT line FROM line)) ORDER BY subtime ;