본문 바로가기
프로그래밍/Database & SQL

[Oracle | 오라클] 다중행 함수(그룹 함수)

by 불타는홍당무 2015. 8. 17.

※ 이 글은 오지영 강사님의 <업무에 바로 쓰는 SQL 활용실습>의 강의내용을 바탕으로 작성하였습니다.



 


1. 합계(SUM), 평균(AVG), 최대값(MAX), 최소값(MIN) 구하기

 

SELECT SUM(sal),AVG(sal), MAX(sal) 

FROM   emp ; 


SELECT SUM(sal), AVG(sal), MAX(sal) 

FROM   emp 

WHERE ename like '%A%' ;


SELECT SUM(sal), AVG(sal), MAX(sal) 

FROM   emp 

WHERE  deptno = 20 ;



2. GROUP BY  특정 컬럼의 값을 기준으로 그룹을 나눈 후 그룹별로 작업 수행에 대한 결과를 출력


SELECT SUM(sal), AVG(sal), MAX(sal), DEPTNO

FROM   emp 

GROUP BY  deptno ; 


SELECT SUM(sal), AVG(sal), MAX(sal) DEPTNO

FROM   emp 

WHERE avg(sal) > 2000 

GROUP BY  deptno ;





연습문제


1. player_t 선수들의 각 팀의 id와 팀 평균키, 팀 평균몸무게, 팀원 수가 얼마인지 조회하기. 평균키가 큰 팀 순서대로

       

SELECT  team_id, AVG(height), AVG(weight), COUNT(*)

FROM    player_t

GROUP BY team_id

ORDER BY AVG(height) DESC ;


2.소속선수들의 평균키가 180보다 큰 포지션 조회하기

  

SELECT position 

FROM   player_t

GROUP BY position 

HAVING AVG(height) > 180;


3.포지션이 DF인 선수들이 각팀에 몇 명씩 있는지 조회하기   

  

SELECT  team_id, COUNT(player_name)

FROM    player_t

WHERE  position ='DF'

GROUP BY  team_id ;  


4. 같은 이름으로 2명 이상 등록되어 있는 동명이인인 선수들 이름만 조회하기


SELECT  player_name, COUNT(*)

FROM    player_t

GROUP BY player_name

HAVING  COUNT(*) >= 2 ;


5. player_t선수들의 이름글자수 기준 몇 명 있는지 조회하기. 한 글자인 선수가 몇 명 두 글자인 선수가 몇 명인지 

    

SELECT LENGTH(player_name), COUNT(*)

FROM   player_t

GROUP BY player_name;


SELECT LENGTH(player_name), COUNT(*)

FROM   player_t

GROUP BY length(player_name) ;


6. 생일이 등록된 선수들을 대상으로 월별 생일자수 조회하기


※ 날짜 정보중 일부요소만 추출해서 사용시


1) TO_CHAR(날짜,'추출정보') 

     SELECT TO_CHAR( sysdate, 'day') FROM dual;

     SELECT TO_CHAR( sysdate, 'year') FROM dual; 

     SELECT TO_CHAR( sysdate,'yyyymm day') FROM dual; 

 

2) EXTRACT (추출정보 from 날짜) 

     SELECT EXTRACT(day from sysdate) FROM dual ;

                                 month

                                 year 

 

SELECT EXTRACT (month from birth), COUNT(*)

FROM   player_t

WHERE birth is NOT null

GROUP BY EXTRACT (month from birth);


7. 생일이 등록된 선수들의 이름, 생일, 연령대 조회하기


선수이름, 생일, 만 나이 조회 ==> 나이는 오늘 기준 몇 개월 살았는지 구해서 12로 나눔.

 

SELECT player_name, birth, MONTHS_BETWEEN(sysdate,birth)/12 AS 나이, 

TRUNC(MONTHS_BETWEEN(sysdate,birth)/12,-1) 연령대

FROM  player_t

WHERE birth IS NOT NULL; 

 

8. 생일이 등록된 선수들 대상으로 연령대별 소속인원이 몇 명인지 조회하기  

 

SELECT TRUNC(months_between(sysdate,birth)/12,-1) 연령대, COUNT(*), AVG(height)

FROM player_t

WHERE birth is not null

GROUP BY TRUNC(MONTHS_BETWEEN(sysdate,birth)/12,-1) ;