[ 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 컬럼이 결합되어 결과 컬럼이 만들어 진다.


  

 

Posted by 농부지기
,