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;
'오라클' 카테고리의 다른 글
오라클 ROLLUP,CUBE,GROUPINGSET 그룹화 함수 (0) | 2013.05.30 |
---|---|
오라클 ROWNUM : 쿼리의 결과의 각각의 행 순서 값을 갖는 의사 컬럼 (0) | 2013.05.30 |
오라클 WHERE절에서 SELECT문 사용하기 (0) | 2013.05.30 |
오라클 집계함수(성능이 많이 떨어짐) (0) | 2013.05.30 |
오라클 집합연산자 (0) | 2013.05.30 |