[ Oracle - PIVOT 함수 - 컬럼2개인 경우 ]

 

1. 정의 : 매장별, 월별 이익금, 매출액 조회(2014.01 ~ 2014.06)

  - 참고 : 1. PIVOT 년월 에  컬럼을 기술하지 않은 경우
           2. PIVOT 컬럼이 두 개 인 경우
           3. SUM() 한 후 컬럼을 지정 (이때 지정하지 않으면  오류 발생)

 


WITH
 SALE_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 SALE_DATA
        )
PIVOT (SUM(PROFIT_AMT)   AS PT_AMT, SUM(SALE_AMT) AS SA_AMT   -- <-- 이곳에 컬럼 지정
                       FOR
 SALE_YM IN ('201401'               -- <-- 이곳에 컬럼을 지정 하지 않은 경우
                                     , '201402'
                                     , '201403'
                                     , '201404'
                                     , '201405'
                                     , '201406'

                                     )
      );
 

결과


결과 컬럼이 : 년월 과 AS 후 컬럼이 결합되어  이익금컬럼과  매출액컬럼이 쌍으로 해서 반복되어 나온다..

                

 


  

2. 정의 : 매장별, 월별 이익금, 매출액 조회(2014.01 ~ 2014.06)

  - 참고 : 1. PIVOT 년월 에  컬럼을 기술 한 경우
           2. PIVOT 컬럼이 두 개 인 경우
           3. SUM() 한 후 컬럼을 지정 (이때 지정하지 않으면  오류 발생)

 


WITH
 SALE_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
             , SALE_AMT
          
FROM SALE_DATA
        )
PIVOT (SUM(PROFIT_AMT)   AS PT_AMT, SUM(SALE_AMT) AS SA_AMT   -- <-- 이곳에 컬럼 지정
                       FOR
 SALE_YM IN ('201401' AS IDX1       -- <-- 이곳에 컬럼 지정
                                     , '201402'
 AS IDX2
                                     , '201403'
 AS IDX3
                                     , '201404'
 AS IDX4
                                     , '201405'
 AS IDX5
                                     , '201406'
 AS IDX6
                                     )
      );
 

결과
결과 컬럼이 : 년월 후의 AS 컬럼과  SUM() 후 AS컬럼이 결합되어  
              이익금컬럼과  매출액컬럼이 쌍으로 해서 반복되어 나온다..
            
 

 


  

Posted by 농부지기
,

[ 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 농부지기
,

[ Oracle - OVER 예제5 ]

 

 Windowing절은 반드시 OVER()함수 내부에 ORDER BY 가 존재 해야 됨
   RANGE절 : 논리적인 상대 번지에 의해 윈도우 크기 지정.

 


WITH
 T AS
(             
SELECT 'GS몰'   AS SHOP, '201405' AS YM, 22000 AS AMT FROM DUAL
    
UNION ALL SELECT 'GS몰'          , '201409'      , 55000        FROM DUAL
    
UNION ALL SELECT 'GS몰'          , '201412'      , 55000        FROM DUAL
    
UNION ALL SELECT '양동점'        , '201401'      , 10000        FROM DUAL
    
UNION ALL SELECT '양동점'        , '201401'      , 20000        FROM DUAL
    
UNION ALL SELECT '양동점'        , '201401'      , 11000        FROM DUAL
    
UNION ALL SELECT '양동점'        , '201403'      , 22000        FROM DUAL
    
UNION ALL SELECT '양동점'        , '201405'      , 33000        FROM DUAL
)
SELECT SHOP, YM
     , 
SUM(AMT) OVER(ORDER BY SHOP, YM 
                     
RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
                     )                                                 
AS SUM_AMT1
--     , SUM(AMT) OVER(ORDER BY SHOP, YM 
--                     RANGE BETWEEN 1 PRECEDING AND 1 FOLLOWING
--                     )                                               AS SUM_AMT2  --오류 발생

     , ROWNUM
     , 
SUM(AMT) OVER(ORDER BY ROWNUM
                     
RANGE BETWEEN 1 PRECEDING AND 1 FOLLOWING
                     )                                        
         AS SUM_AMT3
  
FROM T
 
ORDER BY SHOP, YM ;

 
 

 

 

'(DB) Oracle > SQL.통계-Over함수' 카테고리의 다른 글

Oracle - OVER 예제4  (0) 2017.01.21
Oracle - OVER 예제3  (0) 2017.01.21
Oracle - OVER 예제2  (0) 2017.01.21
Oracle - OVER 예제1  (0) 2017.01.21
Oracle - OVER rows, range 예제1  (0) 2017.01.21
Posted by 농부지기
,