(DB) Oracle/SQL.통계-Pivot함수
Oracle - PIVOT 함수 - 컬럼1개인 경우
농부지기
2017. 1. 21. 13:40
[ Oracle - PIVOT 함수 - 컬럼1개인 경우 ]
1. 정의 : 매장별, 월별 매출액 조회(2014.01 ~ 2014.06)
- 참고 : 1. PIVOT 년월 에 컬럼을 기술하지 않은 경우 2. PIVOT 컬럼이 한 개 인 경우 3. SUM() 한 후 컬럼을 지정하지 않은 경우 |
|
WITH MONTH_DATA AS ( SELECT DECODE(MOD(ROWNUM, 3), 0, '강남점', 1, '역삼점', 2, '평촌점') AS SHOP_NM , TO_CHAR(ADD_MONTHS(TO_DATE('201401', 'YYYYMM'), ROUND(dbms_random.value(0,5),0)), 'YYYYMM') AS SALE_YM , ROUND(dbms_random.value( 1, 5000),0) AS PROFIT_AMT , ROUND(dbms_random.value(5000,10000),0) AS SALE_AMT FROM DUAL CONNECT BY LEVEL <= 25 ) SELECT * FROM ( SELECT SHOP_NM , SALE_YM , PROFIT_AMT FROM MONTH_DATA ) PIVOT (SUM(PROFIT_AMT) -- <-- 이곳에 컬럼을 지정 하지 않은 경우 FOR SALE_YM IN ('201401' -- <-- 이곳에 컬럼을 지정 하지 않은 경우 , '201402' , '201403' , '201404' , '201405' , '201406' ) );
|
결과 |
결과 컬럼이 : 년월로 자동처리 된다. 이 컬럼이 숫자형이라서 single(')quote가 존재하고, java등에서 어떻게 처리 될지 모르겠음.

|
|
2. 정의 : 매장별, 월별 매출액 조회(2014.01 ~ 2014.06)
- 참고 : 1. PIVOT 년월 에 컬럼 기술 한 경우 2. PIVOT 컬럼이 한 개 인 경우
|
|
WITH MONTH_DATA AS ( SELECT DECODE(MOD(ROWNUM, 3), 0, '강남점', 1, '역삼점', 2, '평촌점') AS SHOP_NM , TO_CHAR(ADD_MONTHS(TO_DATE('201401', 'YYYYMM'), ROUND(dbms_random.value(0,5),0)), 'YYYYMM') AS SALE_YM , ROUND(dbms_random.value( 1, 5000),0) AS PROFIT_AMT , ROUND(dbms_random.value(5000,10000),0) AS SALE_AMT FROM DUAL CONNECT BY LEVEL <= 25 ) SELECT * FROM ( SELECT SHOP_NM , SALE_YM , PROFIT_AMT FROM MONTH_DATA ) PIVOT (SUM(PROFIT_AMT) -- <-- 이곳에 컬럼을 지정 하지 않은 경우 FOR SALE_YM IN ('201401' AS PI_201401 -- <-- 이곳에 컬럼을 지정 한 경우 , '201402' AS PI_201402 , '201403' AS PI_201403 , '201404' AS PI_201404 , '201405' AS PI_201405 , '201406' AS PI_201406 ) );
|
결과 |
결과 컬럼이 : 지정한 명칭으로 컬럼이 조회 된다.

|
|
3. 정의 : 매장별, 월별 매출액 조회(2014.01 ~ 2014.06)
- 참고 : 1. PIVOT 년월 에 컬럼을 기술하지 않은 경우 2. PIVOT 컬럼이 한 개 인 경우 3. SUM() 한 후 컬럼을 지정하지 않은 경우
|
|
WITH MONTH_DATA AS ( SELECT DECODE(MOD(ROWNUM, 3), 0, '강남점', 1, '역삼점', 2, '평촌점') AS SHOP_NM , TO_CHAR(ADD_MONTHS(TO_DATE('201401', 'YYYYMM'), ROUND(dbms_random.value(0,5),0)), 'YYYYMM') AS SALE_YM , ROUND(dbms_random.value( 1, 5000),0) AS PROFIT_AMT , ROUND(dbms_random.value(5000,10000),0) AS SALE_AMT FROM DUAL CONNECT BY LEVEL <= 25 ) SELECT * FROM ( SELECT SHOP_NM , SALE_YM , PROFIT_AMT FROM MONTH_DATA ) PIVOT (SUM(PROFIT_AMT) AS PT_AMT -- <-- 이곳에 컬럼을 지정 한 경우 FOR SALE_YM IN ('201401' -- <-- 이곳에 컬럼을 지정 하지 않은 경우 , '201402' , '201403' , '201404' , '201405' , '201406' ) );
|
결과 |
결과 컬럼이 : PIVOT컬럼이 앞쪽 년월 + PT_AMT(AS컬럼) 조합되어 처리 된다. 이 결과 컬럼도 년월(숫자형) + PT_AMT 라서 앞쪽이 숫자라 JAVA단에서 어떻게 처리 될지 모르겠음.

|
|
4. 정의 : 매장별, 월별 매출액 조회(2014.01 ~ 2014.06)
- 참고 : 1. PIVOT 년월 에 컬럼 기술 한 경우 2. PIVOT 컬럼이 한 개 인 경우 3. SUM() 한 후 컬럼을 지정한 경우
|
|
WITH MONTH_DATA AS ( SELECT DECODE(MOD(ROWNUM, 3), 0, '강남점', 1, '역삼점', 2, '평촌점') AS SHOP_NM , TO_CHAR(ADD_MONTHS(TO_DATE('201401', 'YYYYMM'), ROUND(dbms_random.value(0,5),0)), 'YYYYMM') AS SALE_YM , ROUND(dbms_random.value( 1, 5000),0) AS PROFIT_AMT , ROUND(dbms_random.value(5000,10000),0) AS SALE_AMT FROM DUAL CONNECT BY LEVEL <= 25 ) SELECT * FROM ( SELECT SHOP_NM , SALE_YM , PROFIT_AMT FROM MONTH_DATA ) PIVOT (SUM(PROFIT_AMT) AS PT_AMT -- <-- 이곳에 컬럼을 지정 한 경우 FOR SALE_YM IN ('201401' AS PI_201401 -- <-- 이곳에 컬럼을 지정 한 경우 , '201402' AS PI_201402 , '201403' AS PI_201403 , '201404' AS PI_201404 , '201405' AS PI_201405 , '201406' AS PI_201406 ) );
|
결과 |
결과 컬럼이 : 지정한 명칭 과 AS 컬럼이 결합되어 결과 컬럼이 만들어 진다.

|
|