PIVOT FOR IN 질문 0 2 1,478

by 유경호 [SQL Query] [2019.05.10 09:52:03]


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 쿼리 입니다.)

도움 부탁 드립니다.

 

by 마농 [2019.05.10 10:44:08]

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
;

 


by 유경호 [2019.05.10 14:03:18]

넵~감사합니다.

보내주신 쿼리 유용하게 잘 사용 하겠습니다.

즐거운 하루 보내세요.

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입