[SELECT GROUP 예제]

 

☞ GROUP 관련 기본문장형태

 

   SELECT 칼럼명, GROUP 함수
   
FROM   테이블명
   
WHERE  조건식
   
GROUP BY 칼럼명
   
HAVING 조건식
   
ORDER BY 칼럼이나 표현식 ;

☞ SUBGROUP으로 데이터 분류

 

   ※ SELECT절에 그룹함수가 오면 SELECT절의 나머지 컬럼은 GROUP BY절에 기술되어야 함
   ※ GROUP에 대한 조건은 WHERE절에서 기술할 수 없고, HAVING절에서 기술하여야 함
   예시)
     
SELECT dept_id , AVG(salary)
     
FROM   EMP_PAY
     
GROUP BY dept_id
     
HAVING AVG(salary) >= 2000 ;

GROUP된 데이터 조건 검색

 

   예시) 각 직책별로 급여의 총합을 구하되 직책이 부장인 사람은 제외하시오.
           단, 급여총합이 10000이상인 직책만 나타내며, 급여총합에 대한 오름차순으로 정렬하시오.

   SQL>
SELECT title , SUM(salary) 급여총합
        
FROM   EMP_PAY
        
WHERE  title NOT LIKE ‘%부장’
        
GROUP BY title
        
HAVING SUM(salary) >= 10000
        
ORDER BY SUM(salary) ;

☞ ROLLUP과 CUBE를 이용한 데이터 집계

 

   예시)
   
SELECT  store_name "대리점", TO_CHAR(sale_date,'MM') "월", SUM(sale_price) "총판매액"
   
FROM    PROD_SALES
   
GROUP BY  ROLLUP  ( store_name , TO_CHAR
(sale_date,'MM') ) ;

   결과)
   [ROLLUP]
   대리점  월  총판매액  
   --------------------  
   강남점  10   400      
   강남점  11   400
   강남점  12  1400
   강남점      2200

   서초점  10   800
   서초점  11   400
   서초점  12   500
   서초점      1700
               3900

   [CUBE] 
   대리점  월  총판매액
   --------------------
   강남점  10  400
   강남점  11  400
   강남점  12 1400
   강남점     2200

   서초점  10  800
   서초점  11  400
   서초점  12  500
   서초점     1700
           10 1200
           11  800
           12 1900
              3900


 

'(DB) Oracle > SQL' 카테고리의 다른 글

Oracle - 예제_UPDATE  (0) 2017.01.18
Oracle - 예제_SUBQUERY  (0) 2017.01.18
Oracle - 예제_SELECT  (0) 2017.01.18
Oracle - 예제_MERGE  (0) 2017.01.18
Oracle - 예제_INSERT  (0) 2017.01.18
Posted by 농부지기
,

SELECT문

 

1. GROUP 순번_RANK 매기기

2. 컬럼을 ROW화

 

 

조직별로 각사원 급여 지급 순위 메기기 와  전사원에 대한 순위 메기기

SELECT org_id, emp_id, pay_mon,

               RANK() OVER(PARTITION BY org_id ORDER BY pay_mon DESC) as rank_of_org_id,

               RANK() OVER(ORDER BY pay_mon DESC) AS rank_of_all

FROM     py_payroll

WHERE  pay_ymd = '20040123'

ORDER   BY org_id, pay_mon desc;

 

결과]

 

 

설명]

RANK() OVER(PARTITION BY org_id ORDER BY pay_mon DESC) as rank_of_org_id,

   ; org_id 로 partition을 나누고, pay_mon 으로 order by를 DESC 순으로 해서 RANK(순위)를 매긴다.

 RANK() OVER(ORDER BY pay_mon DESC) AS rank_of_all

  ; 전체를 대상으로 pay_mon 으로 order by 를 DESC 순으로 해서 RANK(순위)를 매긴다.

 

컬럼으로 되어 있는 값을 로우(ROW)로 시키기

실제값]

       

 

원하는 결과]

      

 

SQL문]

SELECT decode(seq, 1, a1, 2, b1, c1 ),

             decode(seq, 1, a2, 2, b2, c2 ),

             decode(seq, 1, a3, 2, b3, c3 )

FROM   (

              SELECT seq, a1, a2, a3, b1, b2, b3, c1, c2, c3

              FROM    (SELECT 'A11' a1, 'A12' a2, 'A13' a3, 'B11' b1, 'B12' b2, 'B13' b3, 'C11' c1, 'C12' c2, 'C13' c3

                             FROM   DUAL

                             UNION ALL

                             SELECT 'A21' a1, 'A22' a2, 'A23' a3, 'B21' b1, 'B22' b2, 'B23' b3, 'C21' c1, 'C22' c2, 'C23' c3

                             FROM   DUAL

                             UNION ALL

                             SELECT 'A31' a1, 'A32' a2, 'A33' a3, 'B31' b1, 'B32' b2, 'B33' b3, 'C31' c1, 'C32' c2, 'C33' c3

                             FROM   DUAL), sys_dual

              WHERE  seq <= 3 ) ;

      

   
   

 

'(DB) Oracle > SQL' 카테고리의 다른 글

Oracle - 예제_SUBQUERY  (0) 2017.01.18
Oracle - 예제_SELECT_GROUP  (0) 2017.01.18
Oracle - 예제_MERGE  (0) 2017.01.18
Oracle - 예제_INSERT  (0) 2017.01.18
Oracle - 예제_DELETE  (0) 2017.01.18
Posted by 농부지기
,

                                [ MERGE 문 ]

☞ 정의

 

테이블에 대해 조건적으로 갱신이나 삽입을 할 수 있도록 하는 "upsert" 기능을 제공한다.
 만일 그 행이 테이블에 이미 존재한다면 갱신을 수행하고, 그렇지 않으면 새로 행을 삽입한다.
 데이터 웨어하우징 애플리케이션의 ETL 과정에 유용하다.

☞ 이점

 

 MERGE 문을 사용함으로써 하나의 SQL 문으로 하여금 갱신이나 삽입, 또는 둘 다를 수행할 수 있다.
 MERGE 문은 사용자에게 투명한 방식으로 병렬 수행된다.
 원천 테이블에 대한 스캔이 덜 일어나므로 성능의 향상이 있다.

 

   

☞ 문법

 

MERGE INTO table_name alias
          
USING (table|view|subquery) alias
          
ON    (join condition)
          
WHEN MATCHED THEN
                       
UPDATE SET col1 = val1[, col2 = val2…]
          
WHEN NOT MATCHED THEN
                       
INSERT (컬럼리스트) VALUES
 (값들....);
- INTO clause : data가 update 되거나 insert될 table 이름  
- USING clause : 대상 table의 data와 비교한 후  update 또는 insert할 때 사용할 data의 source.
- ON clause : update나 insert를 하게 될 condition으로, 해당 condition을 만족하는 row가 있으면
    WHEN MATCHED 이하를 실행하게 되고, 없으면 WHEN NOT MATCHED 이하를 실행하게 된다
    WHEN MATCHED : ON clause의 조건이 TRUE인 row에 수행할 내용
    WHEN NOT MATCHED : ON clause의 조건에 맞는 row가 없을 때 수행할 내용

 

☞ 예제

 

예1)       MERGE INTO customer C
           USING cust_src s
           ON    (c.customer_id = s.src_customer_id)
           WHEN MATCHED THEN
                      UPDATE SET c.cust_address = s.cust_address
           WHEN NOT MATCHED THEN
                     INSERT (customer_id, cust_first_name, ...)
             
        VALUES (src_customer_id, src_first_name, …);

 

           MERGE INTO Temp1 a
           USING ( select first from Temp2) t
           ON    (a.first = t.first)            
           WHEN MATCHED THEN
                     UPDATE SET    second = 'second',
                                   third  = 'third',
           WHEN NOT MATCHED THEN
                      INSERT (first,second,third)
                     
VALUES ('first','second','third') ;

 

 

'(DB) Oracle > SQL' 카테고리의 다른 글

Oracle - 예제_SELECT_GROUP  (0) 2017.01.18
Oracle - 예제_SELECT  (0) 2017.01.18
Oracle - 예제_INSERT  (0) 2017.01.18
Oracle - 예제_DELETE  (0) 2017.01.18
Oracle - ROWNUM 개념  (0) 2017.01.18
Posted by 농부지기
,