편집 요약 없음 |
편집 요약 없음 |
||
(같은 사용자의 중간 판 하나는 보이지 않습니다) | |||
1번째 줄: | 1번째 줄: | ||
주로 GROUP BY절과 함께 사용되며, | {{요점 | ||
|내용= 기본 개념 설명 | |||
* Oracle SQL에서 '''그룹 함수(Group Functions)'''는 여러 행(Row)의 값을 그룹으로 묶어 하나의 결과 값으로 요약할 때 사용하는 함수입니다. | |||
* 주로 GROUP BY절과 함께 사용되며, '''집계 함수(Aggregate Functions)'''라고도 부릅니다. | |||
}} | |||
===Oracle의 주요 그룹 함수 종류=== | |||
{| class="wikitable" | {| class="wikitable" | ||
28번째 줄: | 29번째 줄: | ||
=== 주의할 점 === | |||
* NULL은 무시되는 함수가 많습니다 (COUNT(col), SUM(col), AVG(col) 등) | |||
* GROUP BY에서 사용되지 않은 컬럼은 SELECT에 단독으로 쓸 수 없습니다. | |||
* 단일 결과를 원할 경우 GROUP BY 없이 사용할 수 있습니다. | |||
=== 예제 === | |||
==== 기본 예제==== | |||
<source lang=sql> | |||
SELECT COUNT(*) AS TOTAL_EMPLOYEES, | SELECT COUNT(*) AS TOTAL_EMPLOYEES, | ||
SUM(SALARY) AS TOTAL_SALARY, | SUM(SALARY) AS TOTAL_SALARY, | ||
38번째 줄: | 46번째 줄: | ||
MIN(SALARY) AS MIN_SALARY | MIN(SALARY) AS MIN_SALARY | ||
FROM EMPLOYEE; | FROM EMPLOYEE; | ||
</source> | |||
EMPLOYEE 테이블의 직원 수, 급여 합계, 평균, 최고/최저 급여를 한 번에 출력합니다. | EMPLOYEE 테이블의 직원 수, 급여 합계, 평균, 최고/최저 급여를 한 번에 출력합니다. | ||
====GROUP BY와 함께 사용하는 예제==== | |||
<source lang=sql> | |||
SELECT DEPT_ID, | SELECT DEPT_ID, | ||
COUNT(*) AS EMP_COUNT, | COUNT(*) AS EMP_COUNT, | ||
50번째 줄: | 57번째 줄: | ||
FROM EMPLOYEE | FROM EMPLOYEE | ||
GROUP BY DEPT_ID; | GROUP BY DEPT_ID; | ||
</source> | |||
부서별로 직원 수와 평균 급여를 계산합니다. | 부서별로 직원 수와 평균 급여를 계산합니다. | ||
==== HAVING 절로 그룹 조건 추가==== | |||
WHERE는 행 필터링, HAVING은 그룹 필터링에 사용합니다. | WHERE는 행 필터링, HAVING은 그룹 필터링에 사용합니다. | ||
<source lang=sql> | |||
SELECT DEPT_ID, | SELECT DEPT_ID, | ||
64번째 줄: | 71번째 줄: | ||
GROUP BY DEPT_ID | GROUP BY DEPT_ID | ||
HAVING COUNT(*) >= 5; | HAVING COUNT(*) >= 5; | ||
</source> | |||
직원 수가 5명 이상인 부서만 조회합니다. | 직원 수가 5명 이상인 부서만 조회합니다. | ||
==== 고급 기능 및 실무 예제 ==== | |||
▶ 예제 1: 평균 이상 급여 직원 조회 | ▶ 예제 1: 평균 이상 급여 직원 조회 | ||
<source lang=sql> | |||
SELECT * | SELECT * | ||
FROM EMPLOYEE | FROM EMPLOYEE | ||
WHERE SALARY > ( | WHERE SALARY > ( | ||
SELECT AVG(SALARY) FROM EMPLOYEE | SELECT AVG(SALARY) FROM EMPLOYEE | ||
); | );</source> | ||
서브쿼리를 통해 전체 평균보다 높은 급여를 받는 직원을 조회합니다. | 서브쿼리를 통해 전체 평균보다 높은 급여를 받는 직원을 조회합니다. | ||
▶ 예제 2: 월별 매출 요약 | ▶ 예제 2: 월별 매출 요약 | ||
<source lang=sql> | |||
SELECT | SELECT | ||
TO_CHAR(SALE_DATE, 'YYYY-MM') AS 월, | TO_CHAR(SALE_DATE, 'YYYY-MM') AS 월, | ||
151번째 줄: | 97번째 줄: | ||
FROM SALES | FROM SALES | ||
GROUP BY TO_CHAR(SALE_DATE, 'YYYY-MM') | GROUP BY TO_CHAR(SALE_DATE, 'YYYY-MM') | ||
ORDER BY 월; | ORDER BY 월;</source> | ||
TO_CHAR()로 날짜를 월 단위로 변환해 그룹핑합니다. | TO_CHAR()로 날짜를 월 단위로 변환해 그룹핑합니다. | ||
▶ 예제 3: 부서별 최고 급여자 정보 | ▶ 예제 3: 부서별 최고 급여자 정보 | ||
<source lang=sql> | |||
SELECT * | SELECT * | ||
FROM EMPLOYEE E | FROM EMPLOYEE E | ||
165번째 줄: | 111번째 줄: | ||
FROM EMPLOYEE | FROM EMPLOYEE | ||
GROUP BY DEPT_ID | GROUP BY DEPT_ID | ||
); | );</source> | ||
서브쿼리로 부서별 최고 급여를 구하고, 그 조건에 맞는 직원 정보 추출합니다. | 서브쿼리로 부서별 최고 급여를 구하고, 그 조건에 맞는 직원 정보 추출합니다. | ||
▶ 예제 4: 비율(%) 분석 | ▶ 예제 4: 비율(%) 분석 | ||
<source lang=sql> | |||
SELECT | SELECT | ||
DEPT_ID, | DEPT_ID, | ||
178번째 줄: | 125번째 줄: | ||
ROUND(COUNT(*) * 100.0 / SUM(COUNT(*)) OVER (), 2) AS 비율 | ROUND(COUNT(*) * 100.0 / SUM(COUNT(*)) OVER (), 2) AS 비율 | ||
FROM EMPLOYEE | FROM EMPLOYEE | ||
GROUP BY DEPT_ID; | GROUP BY DEPT_ID;</source> | ||
전체에서 해당 그룹이 차지하는 **구성비(%)**를 계산합니다. | 전체에서 해당 그룹이 차지하는 **구성비(%)**를 계산합니다. | ||
SUM(...) OVER ()는 전체 합계를 구할 때 사용하는 윈도우 함수입니다. | SUM(...) OVER ()는 전체 합계를 구할 때 사용하는 윈도우 함수입니다. | ||
▶ 예제 5: 다중 집계 GROUPING SETS, ROLLUP, CUBE | ▶ 예제 5: 다중 집계 GROUPING SETS, ROLLUP, CUBE | ||
<source lang=sql> | |||
-- ROLLUP: 부서별 + 전체 합계 | -- ROLLUP: 부서별 + 전체 합계 | ||
SELECT DEPT_ID, JOB_ID, SUM(SALARY) AS 합계 | SELECT DEPT_ID, JOB_ID, SUM(SALARY) AS 합계 | ||
205번째 줄: | 152번째 줄: | ||
() | () | ||
); | ); | ||
</source> | |||
복잡한 다차원 집계가 필요한 리포트에 활용됩니다. | 복잡한 다차원 집계가 필요한 리포트에 활용됩니다. | ||
=== 요점 정리 === | |||
{| class="wikitable" | {| class="wikitable" | ||
|+ Oracle Group Function 고급 기능 요약 | |+ Oracle Group Function 고급 기능 요약 |
2025년 5월 18일 (일) 11:29 기준 최신판
menu_book 기본 개념 설명
- Oracle SQL에서 그룹 함수(Group Functions)는 여러 행(Row)의 값을 그룹으로 묶어 하나의 결과 값으로 요약할 때 사용하는 함수입니다.
- 주로 GROUP BY절과 함께 사용되며, 집계 함수(Aggregate Functions)라고도 부릅니다.
Oracle의 주요 그룹 함수 종류
함수명 | 설명 | 예제 SQL | 결과 예시 |
---|---|---|---|
COUNT() | 행 수를 셉니다 (NULL 제외) | SELECT COUNT(*) FROM EMPLOYEE; | 전체 직원 수 |
SUM() | 숫자 컬럼의 합을 구합니다 | SELECT SUM(SALARY) FROM EMPLOYEE; | 전체 급여 합계 |
AVG() | 평균 값을 계산합니다 | SELECT AVG(SALARY) FROM EMPLOYEE; | 평균 급여 |
MAX() | 최댓값을 반환합니다 | SELECT MAX(SALARY) FROM EMPLOYEE; | 최고 급여 |
MIN() | 최솟값을 반환합니다 | SELECT MIN(SALARY) FROM EMPLOYEE; | 최저 급여 |
STDDEV() | 표준 편차를 구합니다 | SELECT STDDEV(SALARY) FROM EMPLOYEE; | 급여 분산도 |
VARIANCE() | 분산을 구합니다 | SELECT VARIANCE(SALARY) FROM EMPLOYEE; | 급여 분산 값 |
주의할 점
- NULL은 무시되는 함수가 많습니다 (COUNT(col), SUM(col), AVG(col) 등)
- GROUP BY에서 사용되지 않은 컬럼은 SELECT에 단독으로 쓸 수 없습니다.
- 단일 결과를 원할 경우 GROUP BY 없이 사용할 수 있습니다.
예제
기본 예제
SELECT COUNT(*) AS TOTAL_EMPLOYEES, SUM(SALARY) AS TOTAL_SALARY, AVG(SALARY) AS AVG_SALARY, MAX(SALARY) AS MAX_SALARY, MIN(SALARY) AS MIN_SALARY FROM EMPLOYEE;
EMPLOYEE 테이블의 직원 수, 급여 합계, 평균, 최고/최저 급여를 한 번에 출력합니다.
GROUP BY와 함께 사용하는 예제
SELECT DEPT_ID, COUNT(*) AS EMP_COUNT, AVG(SALARY) AS AVG_SALARY FROM EMPLOYEE GROUP BY DEPT_ID;
부서별로 직원 수와 평균 급여를 계산합니다.
HAVING 절로 그룹 조건 추가
WHERE는 행 필터링, HAVING은 그룹 필터링에 사용합니다.
SELECT DEPT_ID, COUNT(*) AS EMP_COUNT FROM EMPLOYEE GROUP BY DEPT_ID HAVING COUNT(*) >= 5;
직원 수가 5명 이상인 부서만 조회합니다.
고급 기능 및 실무 예제
▶ 예제 1: 평균 이상 급여 직원 조회
SELECT * FROM EMPLOYEE WHERE SALARY > ( SELECT AVG(SALARY) FROM EMPLOYEE );
서브쿼리를 통해 전체 평균보다 높은 급여를 받는 직원을 조회합니다.
▶ 예제 2: 월별 매출 요약
SELECT TO_CHAR(SALE_DATE, 'YYYY-MM') AS 월, SUM(SALE_AMOUNT) AS 월매출, COUNT(*) AS 거래건수 FROM SALES GROUP BY TO_CHAR(SALE_DATE, 'YYYY-MM') ORDER BY 월;
TO_CHAR()로 날짜를 월 단위로 변환해 그룹핑합니다.
▶ 예제 3: 부서별 최고 급여자 정보
SELECT * FROM EMPLOYEE E WHERE (E.DEPT_ID, E.SALARY) IN ( SELECT DEPT_ID, MAX(SALARY) FROM EMPLOYEE GROUP BY DEPT_ID );
서브쿼리로 부서별 최고 급여를 구하고, 그 조건에 맞는 직원 정보 추출합니다.
▶ 예제 4: 비율(%) 분석
SELECT DEPT_ID, COUNT(*) AS 직원수, ROUND(COUNT(*) * 100.0 / SUM(COUNT(*)) OVER (), 2) AS 비율 FROM EMPLOYEE GROUP BY DEPT_ID;
전체에서 해당 그룹이 차지하는 **구성비(%)**를 계산합니다.
SUM(...) OVER ()는 전체 합계를 구할 때 사용하는 윈도우 함수입니다.
▶ 예제 5: 다중 집계 GROUPING SETS, ROLLUP, CUBE
-- ROLLUP: 부서별 + 전체 합계 SELECT DEPT_ID, JOB_ID, SUM(SALARY) AS 합계 FROM EMPLOYEE GROUP BY ROLLUP(DEPT_ID, JOB_ID); -- CUBE: 모든 조합(부서, 직무별 합계, 전체 합계 포함) SELECT DEPT_ID, JOB_ID, SUM(SALARY) AS 합계 FROM EMPLOYEE GROUP BY CUBE(DEPT_ID, JOB_ID); -- GROUPING SETS: 원하는 조합만 집계 SELECT DEPT_ID, JOB_ID, SUM(SALARY) AS 합계 FROM EMPLOYEE GROUP BY GROUPING SETS ( (DEPT_ID), (JOB_ID), () );
복잡한 다차원 집계가 필요한 리포트에 활용됩니다.
요점 정리
기능명 | 설명 | 예제 구문 |
---|---|---|
GROUP BY | 컬럼 기준으로 행을 그룹화 | SELECT DEPT_ID, AVG(SALARY) FROM EMPLOYEE GROUP BY DEPT_ID; |
HAVING | 그룹 조건 필터링 | ... HAVING COUNT(*) > 5; |
ROLLUP | 소계, 총계 계산 | GROUP BY ROLLUP(DEPT_ID, JOB_ID) |
CUBE | 다차원 집계 (모든 조합) | GROUP BY CUBE(DEPT_ID, JOB_ID) |
GROUPING SETS | 특정 조합만 집계 | GROUP BY GROUPING SETS ((DEPT_ID), (JOB_ID), ()) |
비율 계산 | 전체 대비 그룹 비율 | COUNT(*) * 100 / SUM(COUNT(*)) OVER () |