오늘은 행으로 나열된 데이터를 열로 변환하는 내용을 포스팅 하겠어요
쿼리를 짜다 보면 행으로 나열된 테이블만으로 항목별 정보를 조회해야 하는 일들이 발생하는데요
행을 열로 변환 할때는 CASE WHEN, MAX 함수를 사용하여 변환이 가능합니다.
CASE WHEN 구문 사용법을 모르시면 여기를 참고 하시구요
자 그럼 행열을 변환하는 쿼리에 대한 포스팅을 시작해 볼까요
WITH TDATA AS ( SELECT 3 AS 판매량, '미국' 국적, '핸드폰' AS 판매제품 FROM DUAL UNION ALL SELECT 15 AS 판매량, '한국' 국적, '냉장고' AS 판매제품 FROM DUAL UNION ALL SELECT 8 AS 판매량, '대만' 국적, '핸드폰' AS 판매제품 FROM DUAL UNION ALL SELECT 5 AS 판매량, '한국' 국적, '자동차' AS 판매제품 FROM DUAL UNION ALL SELECT 42 AS 판매량, '한국' 국적, '핸드폰' AS 판매제품 FROM DUAL UNION ALL SELECT 24 AS 판매량, '미국' 국적, '냉장고' AS 판매제품 FROM DUAL UNION ALL SELECT 24 AS 판매량, '미국' 국적, '카메라' AS 판매제품 FROM DUAL ) SELECT * FROM TDATA; |
|
1. 테스트를위해 WITH문을사용하여 TDATA 라는데이터를만들어서조회한결과입니다.
이데이터를이용하여 행열 변환 쿼리를 적용해 보도록 하겠습니다.
SELECT 국적 ,CASE WHEN 판매제품='핸드폰' THEN SUM(판매량) ELSE 0 END 핸드폰 ,CASE WHEN 판매제품='냉장고' THEN SUM(판매량) ELSE 0 END 냉장고 ,CASE WHEN 판매제품='자동차' THEN SUM(판매량) ELSE 0 END 자동차 ,CASE WHEN 판매제품='카메라' THEN SUM(판매량) ELSE 0 END 카메라 FROM TDATA GROUP BY 국적,판매제품 ORDER BY 국적; |
|
2. CASE WHEN 문을 사용하여 판매제품 컬럼을 만들었고 국적별, 판매제품별 판매량을 구해봤어요
그런데 국적별로 ROW가 여러 개씩 있네요. 국적이 한국인 ROW는 3개나 았네요.
이 중복되는 ROW들을 하나로 ROW로 합쳐야 겠지요
SELECT 국적 ,MAX(핸드폰) AS 핸드폰 ,MAX(냉장고) AS 냉장고 ,MAX(자동차) AS 자동차 ,MAX(카메라) AS 카메라 FROM ( SELECT 국적 ,CASE WHEN 판매제품='핸드폰' THEN SUM(판매량) ELSE 0 END 핸드폰 ,CASE WHEN 판매제품='냉장고' THEN SUM(판매량) ELSE 0 END 냉장고 ,CASE WHEN 판매제품='자동차' THEN SUM(판매량) ELSE 0 END 자동차 ,CASE WHEN 판매제품='카메라' THEN SUM(판매량) ELSE 0 END 카메라 FROM TDATA GROUP BY 국적,판매제품 ORDER BY 국적 ) GROUP BY 국적; |
3. 위의 결과에서 국적별로 GROUP BY를 다시 해주고 판매제품 컬럼별로 MAX값을 읽어 컬럼을 만드니
이렇게 행열 변환이 완성되였네요
'SQL > ORACLE함수' 카테고리의 다른 글
[오라클함수] 오라클 CASE WHEN THEN 구문 (0) | 2014.06.11 |
---|---|
[오라클함수] 오라클 DECODE함수 사용하기 (0) | 2014.06.11 |
[오라클함수] GROUP BY 컬럼..컬럼 사용하기 (0) | 2014.06.11 |
[오라클함수] DB LINK 연결 사용 (0) | 2014.06.11 |
[오라클함수] TRUNC함수를 이용한 소숫점, 날짜 형식 짜르기 (0) | 2014.06.11 |
오라클 EXISTS함수, NOT EXISTS, MINUS (2) | 2014.06.11 |
오라클 프로시져 기본 문법 (0) | 2014.06.11 |
오라클 - 데이터 가져오기편 1 (0) | 2014.06.11 |