MSSQL 피벗 질문 드립니다. 0 5 2,425

by 하루이 [SQL Query] UNPIVOT PIVOT [2023.08.18 16:37:08]


mssql로 행을 열로 보여주려 합니다.
데이터는 아래와 같습니다.
ITEM_DESC는  우선 3개의 타입 고정입니다.
UNPIVOT 후 PIVOT으로 행을 열로 보여주려 하는데 잘 되지 않아서 문의글을 올립니다.

WITH T AS (

SELECT 8 AS SEQ , 'DISP0002' ITEM_DESC , 'C' AS ITEM_TYPE, 'AA' AS OWNER union all
SELECT 8 AS SEQ , 'DISP0003' ITEM_DESC , 'C' AS ITEM_TYPE, 'CC' AS OWNER union all
SELECT 8 AS SEQ , 'DISP0004' ITEM_DESC , 'C' AS ITEM_TYPE, 'BB' AS OWNER union all
SELECT 9 AS SEQ , 'DISP0002' ITEM_DESC , 'I' AS ITEM_TYPE, 'AA' AS OWNER union all
SELECT 9 AS SEQ , 'DISP0003' ITEM_DESC , 'I' AS ITEM_TYPE, 'AA' AS OWNER union all
SELECT 9 AS SEQ , 'DISP0004' ITEM_DESC , 'C' AS ITEM_TYPE, 'DD' AS OWNER
)
SELECT * FROM T

SEQ ITEM_DESC ITEM_TYPE OWNER
8 DISP0002 C AA
8 DISP0003 C CC
8 DISP0004 C BB
9 DISP0002 I AA
9 DISP0003 I AA
9 DISP0004 C DD

결과

SEQ DISP0002_TYPE DISP0002_OWNER DISP0003_TYPE DISP0003_OWNER DISP0004_TYPE DISP0004_OWNER
8 C AA C CC C BB
9 I AA I AA C DD

 

by 마농 [2023.08.20 22:54:31]
WITH T AS
(
SELECT 8 seq, 'DISP0002' item_desc, 'C' item_type, 'AA' owner
UNION ALL SELECT 8, 'DISP0003', 'C', 'CC'
UNION ALL SELECT 8, 'DISP0004', 'C', 'BB'
UNION ALL SELECT 9, 'DISP0002', 'I', 'AA'
UNION ALL SELECT 9, 'DISP0003', 'I', 'AA'
UNION ALL SELECT 9, 'DISP0004', 'C', 'DD'
)
SELECT seq
     , MIN(CASE item_desc WHEN 'DISP0002' THEN item_type END) disp0002_type
     , MIN(CASE item_desc WHEN 'DISP0002' THEN owner     END) disp0002_owner
     , MIN(CASE item_desc WHEN 'DISP0003' THEN item_type END) disp0003_type
     , MIN(CASE item_desc WHEN 'DISP0003' THEN owner     END) disp0003_owner
     , MIN(CASE item_desc WHEN 'DISP0004' THEN item_type END) disp0004_type
     , MIN(CASE item_desc WHEN 'DISP0004' THEN owner     END) disp0004_owner
  FROM t
 GROUP BY seq
;

 


by 하루이 [2023.08.21 13:16:21]

감사합니다.
왜 unpivot ,pivot 만 생각했는지 부끄럽습니다.


by 마농 [2023.08.21 13:35:23]

Oracle 의 경우 다중 항목으로 PIVOT/UNPIVOT 이 가능합니다.
MSSQL 의 경우 여러가지 시도해 봤는데 안되는 것 같습니다.
 

WITH t AS
(
SELECT 8 seq, 'DISP0002' item_desc, 'C' item_type, 'AA' owner FROM dual
UNION ALL SELECT 8, 'DISP0003', 'C', 'CC' FROM dual
UNION ALL SELECT 8, 'DISP0004', 'C', 'BB' FROM dual
UNION ALL SELECT 9, 'DISP0002', 'I', 'AA' FROM dual
UNION ALL SELECT 9, 'DISP0003', 'I', 'AA' FROM dual
UNION ALL SELECT 9, 'DISP0004', 'C', 'DD' FROM dual
)
-- Oracle --
SELECT *
  FROM t
 PIVOT (MIN(item_type) type, MIN(owner) owner
        FOR item_desc IN ( 'DISP0002' DISP0002
                         , 'DISP0003' DISP0003
                         , 'DISP0004' DISP0004
                         ) )
;

 


by 하루이 [2023.08.21 13:50:03]


            그런데 UNPIVOT ,PIVOT 으로는 안될까요? 
            CONCAT(item_desc,'/',item_type,'/',owner) AS COLUM_Type
            으로 묶은후 피벗으로 행으로 변환 시켰습니다.
            
            기본 쿼리 구현후 펑션(ITEM_DESC가 동적이라서)으로 작성해 보려 합니다

제가 다시 질문 드릴려고 했는데 추가 답변 미리 주셔서 감사합니다.


by 마농 [2023.08.21 14:03:09]

글쎄요?
지금 언급하신 방식(붙여서 피봇 후 잘라 쓰기)으로 가능할 듯 합니다.
잘 안돼서 질문하시는 건가요?
동적 구현으로 하더라도 잘라쓰는 과정만 더 복잡해 집니다.
MIN(CASE 부분을 동적으로 구현하는 방법이 나을 듯 하네요.
 

WITH t AS
(
SELECT 8 seq, 'DISP0002' item_desc, 'C' item_type, 'AA' owner
UNION ALL SELECT 8, 'DISP0003', 'C', 'CC'
UNION ALL SELECT 8, 'DISP0004', 'C', 'BB'
UNION ALL SELECT 9, 'DISP0002', 'I', 'AA'
UNION ALL SELECT 9, 'DISP0003', 'I', 'AA'
UNION ALL SELECT 9, 'DISP0004', 'C', 'DD'
)
SELECT seq
     , SUBSTRING(disp0002, 1, 1) disp0002_type
     , SUBSTRING(disp0002, 2, 9) disp0002_owner
     , SUBSTRING(disp0003, 1, 1) disp0003_type
     , SUBSTRING(disp0003, 2, 9) disp0003_owner
     , SUBSTRING(disp0004, 1, 1) disp0004_type
     , SUBSTRING(disp0004, 2, 9) disp0004_owner
  FROM (SELECT seq
             , item_desc
             , CONCAT(item_type, owner) v
          FROM t
        ) a
 PIVOT (MIN(v) FOR item_desc IN ([DISP0002], [DISP0003], [DISP0004])) a
;

 

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