열과 행의 변환 0 3 1,604

by 미노~ [SQL Query] [2023.03.20 15:00:42]


안녕하세요. 오라클을 사용하고 있습니다.

아래와 같이 쿼리결과에 대해 열과 행을 변환하여 표시하고자 합니다.

관련 Q&A를 검색해봤는데 그래도 잘 이해가 안되네요.

관련하여 도움을 주시면 감사하겠습니다.

SELECT 'A' AS GUBUN, 100 AS PLAN, 90 AS RECORD FROM DUAL
UNION ALL 
SELECT 'B' AS GUBUN, 200 AS PLAN, 150 AS RECORD FROM DUAL
UNION ALL 
SELECT 'C' AS GUBUN, 150 AS PLAN, 140 AS RECORD FROM DUAL

 

결과

GUBUN    PLAN    RECORD

    A          100         90

    B          200        150

    C          150        140

위의 결과를 아래와 같이 변환

GUBUN         A          B         C

  PLAN         100       200      150

 RECORD        90       150      140

 

 

 

 

 

 

by 신이만든지기 [2023.03.20 17:20:08]
with tmp as (
    select 'A' gubun, 100 plan, 90 record from dual union all
    select 'B' gubun, 200 plan, 150 record from dual union all
    select 'C' gubun, 150 plan, 140 record from dual)
select 'PLAN' AS "GUBUN", A, B, C
  from (select gubun, plan from tmp)
 pivot (
	max(plan) for gubun in ('A' AS A, 'B' AS B, 'C' AS C)    
 )    
union all
select 'RECORD', A, B, C
  from (select gubun, record from tmp)
 pivot (
	max(record) for gubun in ('A' AS A, 'B' AS B, 'C' AS C)    
 )    
    ;

 


by 미노~ [2023.03.20 18:22:36]

감사합니다.

답변주신 내용 많이 참고가 되었습니다.

번거로우시겠지만 추가로 질의를 드리면 행으로 변환해야할 항목들이 많아서 위 쿼리로 하기엔 하드코딩이 너무 많아 질것같아 아래와 같이 쿼리를 좀 변경하였습니다.

----------------------------------------------------------------------------------------

WITH T AS
(
SELECT 'A' GUBUN, 100 PLAN,  90 RECORD, 10 RATE FROM DUAL UNION ALL 
SELECT 'B' GUBUN, 200 PLAN, 150 RECORD, 40 RATE FROM DUAL UNION ALL 
SELECT 'C' GUBUN, 150 PLAN, 140 RECORD,  5 RATE FROM DUAL
)
SELECT *
  FROM T
 UNPIVOT (VALUE FOR COL IN (PLAN, RECORD, RATE))
 PIVOT (MIN(VALUE) FOR GUBUN IN ('A', 'B', 'C'))

----------------------------------------------------------------------------------------

여기에서 해결되지 않는 부분은 행의 순서가 위의 UNPIVIOT IN 구문에 기재된 순서대로 표현되고

싶은데 이에 대한 정렬이 위 쿼리의 결과는

RECORD

RATE

PLAN 순으로 나옵니다. 

이를 IN 구문에 표시한 순서대로 아래오 같은 결과가 표현될수 있는 방법은 없을까요..

PLAN 

RECORD

RATE


by 마농 [2023.03.20 22:49:14]
-- IN 절 자동은 안됩니다. 수동으로 지정 --
 ORDER BY DECODE(col, 'PLAN', 1, 'RECORD', 2, 'RATE', 3)
 ORDER BY INSTR('PLAN,RECORD,RATE', col)

 

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