집계쿼리좀 봐주세요~ 0 2 962

by 통합문서 [SQL Query] [2019.10.29 20:56:43]


행과 열을 바꿔 집계하는게 쉽지 않네요. 

아래와 같은 데이터를 원하는 값으로 변경하려면 어떻게 해야할까요. 단순 행열 변환이 아닌데.. ㅜ

A X 11 12 13
A Y 21 22 23
A Z 31 32 33
B X 41 42 43
B Y 51 52 53
B Z 61 62 63

 

원하는 값 

A X 11 12 13 Y 21 22 23 Z 31 32 33
B X 41 42 43 Y 51 52 53 Z 61 62 63

 

by 마농 [2019.10.30 07:43:05]
WITH t AS
(
SELECT 'A' gb, 'X' cd, 11 v1, 12 v2, 13 v3 FROM dual
UNION ALL SELECT 'A', 'Y', 21, 22, 23 FROM dual
UNION ALL SELECT 'A', 'Z', 31, 32, 33 FROM dual
UNION ALL SELECT 'B', 'X', 41, 42, 43 FROM dual
UNION ALL SELECT 'B', 'Y', 51, 52, 53 FROM dual
UNION ALL SELECT 'B', 'Z', 61, 62, 63 FROM dual
)
-- 1. GROUP BY, MIN(DECODE())
SELECT gb
     ,                'X'       x0    -- 이 부분이 꼭 필요한지? 없어도 될 듯.
     , MIN(DECODE(cd, 'X', v1)) x1
     , MIN(DECODE(cd, 'X', v2)) x2
     , MIN(DECODE(cd, 'X', v3)) x3
     ,                'Y'       y0
     , MIN(DECODE(cd, 'Y', v1)) y1
     , MIN(DECODE(cd, 'Y', v2)) y2
     , MIN(DECODE(cd, 'Y', v3)) y3
     ,                'Z'       z0
     , MIN(DECODE(cd, 'Z', v1)) z1
     , MIN(DECODE(cd, 'Z', v2)) z2
     , MIN(DECODE(cd, 'Z', v3)) z3
  FROM t
 GROUP BY gb
 ORDER BY gb
;
-- 2. PIVOT
SELECT *
  FROM t
 PIVOT (MIN(v1) "1", MIN(v2) "2", MIN(v3) "3" FOR cd IN ('X' x, 'Y' y, 'Z' z))
;

 


by 통합문서 [2019.10.30 09:19:21]

네 필요없다고 하신부분은 없어도 되네요. 피봇함수 엄청나네요. 저렇게 간단히 되다니; 답변 정말 감사합니다. 마농님 쵝오~!

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