본문 바로가기

오라클

오라클 GROUP BY : 그룹별 통계

GROUP BY 


그룹별 통계(똑같은 데이타를 하나의 행으로 묶어준다)

그룹바이에 사용될 컬럼은 셀렉트문에 사용된 컬럼이여야 가능하다.

집계함수와 GROUP BY를 같이 쓰면 일반컬럼과도 사용가능하다. 


예제 ) 부서별 급여의 합 계산 

SELECT 	 buseo
, 	 	 SUM(basicpay) 
FROM 	 insa;

=> 에러가 난다 (부서는 여러행 , 합은 하나의 행이므로 에러)

집계함수(SUM)를 GROUP BY문 없이 사용할때 나타나는 에러 : 단일 그룹의 그룹 함수가 아닙니다)


SELECT 	 buseo
, 	 	 SUM(basicpay)
FROM 	 insa
GROUP BY 	 buseo;

=> GROUP BY에 있는 컬럼만 SELECT문에서 사용 가능함

 

예제 )부서별 직위별 인원수

SELECT buseo, jikwi, COUNT(*) 
FROM insa 
GROUP BY buseo,jikwi;

SELECT buseo, jikwi, COUNT(*) 
FROM insa 
GROUP BY buseo,jikwi
ORDER BY buseo; -- 오름차순정렬

예제 )서울 사람중 부서별 인원수 구하기

SELECT 	 buseo
,	 	 COUNT(*)
FROM insa
WHERE city='서울'
GROUP BY buseo;

  

예제 )부서별 인원수 출력

   --부서명 전체인원수 남자인원수 여자인원수

SELECT buseo,
 	 COUNT(*), COUNT(DECODE(MOD(SUBSTR(ssn,8,1),2),1,'남')),
 	 COUNT(DECODE(MOD(SUBSTR(ssn,8,1),2),0,'여'))
FROM insa
GROUP BY buseo;

-- 위문제의 또 다른 풀이
select buseo
 	  , count(*), 
 	 count(case
 	 	 when substr(ssn,8,1) in (1,3,5) then '남자'
 	 	 end) 남자인원수 ,
 	 count(case 
 	 	 when substr(ssn,8,1) in (2,4,6) then '여자'
 	 	 end) 여자인원수 
from insa
group by buseo

     

예제 )입사년도별 인원수 구하기

   --입사년도,인원수

SELECT TO_CHAR(ibsadate,'YYYY') 입사년도
, 	 COUNT(*) 인원수
FROM insa
GROUP BY TO_CHAR(ibsadate,'YYYY')
ORDER BY TO_CHAR(ibsadate,'YYYY');


예제 ) 출신도별 성별 인원수

SELECT city
, 	 COUNT(DECODE(MOD(SUBSTR(ssn,8,1),2),1,'남'))
, 	 COUNT(DECODE(MOD(SUBSTR(ssn,8,1),2),0,'여'))
FROM insa
GROUP BY city;

SELECT city
, 	 DECODE(MOD(SUBSTR(ssn,8,1),2),1 '남',0,'여') 성별
, 	 COUNT(*) 인원수
FROM insa
GROUP BY city, DECODE(MOD(SUBSTR(ssn,8,10,2),1,'남',0,'여')
ORDER BY city; -- 위아래 똑같다. 차이는 그룹바이에도 문법이 들어올 수 있다. 셀렉트문과 그룹바이문이 똑같아야만 한다.



HAVING


GROUP BY 된 결과의 조건


예제 ) 부서별 인원수를 출력하되 인원수가 7명 이상인 경우만 출력

SELECT buseo, COUNT(*) FROM insa GROUP BY buseo;
SELECT BUSEO, COUNT(*) FROM insa GROUP BY buseo HAVING COUNT(*) >=7;


예제 ) 부서별 남자인원수가 5명이상인 부서명과 인원수

SELECT buseo,COUNT(*) 
FROM insa
WHERE SUBSTR(ssn,8,1) IN (1,3,5)
GROUP BY buseo;
SELECT buseo, COUNT(*) 
FROM insa
WHERE SUBSTR(ssn,8,1) IN (1,3,5)
GROUP BY buseo
HAVING COUNT(*) >=5; -- 위 예제의 5이상 인것만 출력


예제 ) 입사월별 인원수를 출력 하되 인원수가 5명 이상인 경우만 출력

  -- 출력 : 월 인원수

SELECT TO_CHAR(ibsadate, 'MM') 입사월, COUNT(*) 인원수
FROM insa
GROUP BY TO_CHAR(ibsadate, 'MM')
HAVING COUNT(*)>=5;