메뉴 여닫기
개인 메뉴 토글
로그인하지 않음
만약 지금 편집한다면 당신의 IP 주소가 공개될 수 있습니다.
편집 요약 없음
편집 요약 없음
1번째 줄: 1번째 줄:
Oracle SQL에서 **그룹 함수(Group Functions)**는 여러 행(Row)의 값을 그룹으로 묶어 하나의 결과 값으로 요약할 때 사용하는 함수입니다.
주로 GROUP BY절과 함께 사용되며, **집계 함수(Aggregate Functions)**라고도 부릅니다.


{{요점
|내용= 기본 개념 설명
* Oracle SQL에서 '''그룹 함수(Group Functions)'''는 여러 행(Row)의 값을 그룹으로 묶어 하나의 결과 값으로 요약할 때 사용하는 함수입니다.
* 주로 GROUP BY절과 함께 사용되며, '''집계 함수(Aggregate Functions)'''라고도 부릅니다.
}}


Oracle의 주요 그룹 함수 종류
===Oracle의 주요 그룹 함수 종류===


{| class="wikitable"
{| class="wikitable"
30번째 줄: 32번째 줄:


✅ 기본 예제


=== 주의할 점 ===
* 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번째 줄: 48번째 줄:
       MIN(SALARY) AS MIN_SALARY
       MIN(SALARY) AS MIN_SALARY
FROM EMPLOYEE;
FROM EMPLOYEE;
</source>


EMPLOYEE 테이블의 직원 수, 급여 합계, 평균, 최고/최저 급여를 한 번에 출력합니다.
EMPLOYEE 테이블의 직원 수, 급여 합계, 평균, 최고/최저 급여를 한 번에 출력합니다.
43번째 줄: 54번째 줄:


GROUP BY와 함께 사용하는 예제
====GROUP BY와 함께 사용하는 예제====
 
<source lang=sql>
SELECT DEPT_ID,
SELECT DEPT_ID,
       COUNT(*) AS EMP_COUNT,
       COUNT(*) AS EMP_COUNT,
50번째 줄: 61번째 줄:
FROM EMPLOYEE
FROM EMPLOYEE
GROUP BY DEPT_ID;
GROUP BY DEPT_ID;
</source>


부서별로 직원 수와 평균 급여를 계산합니다.
부서별로 직원 수와 평균 급여를 계산합니다.
55번째 줄: 67번째 줄:


HAVING 절로 그룹 조건 추가
==== HAVING 절로 그룹 조건 추가====


WHERE는 행 필터링, HAVING은 그룹 필터링에 사용합니다.
WHERE는 행 필터링, HAVING은 그룹 필터링에 사용합니다.
<source lang=sql>


SELECT DEPT_ID,
SELECT DEPT_ID,
64번째 줄: 77번째 줄:
GROUP BY DEPT_ID
GROUP BY DEPT_ID
HAVING COUNT(*) >= 5;
HAVING COUNT(*) >= 5;
</source>


직원 수가 5명 이상인 부서만 조회합니다.
직원 수가 5명 이상인 부서만 조회합니다.
69번째 줄: 83번째 줄:


✅ 주의할 점
==== 고급 기능 및 실무 예제 ====
• NULL은 무시되는 함수가 많습니다 (COUNT(col), SUM(col), AVG(col) 등)
• GROUP BY에서 사용되지 않은 컬럼은 SELECT에 단독으로 쓸 수 없습니다.
• 단일 결과를 원할 경우 GROUP BY 없이 사용할 수 있습니다.
 
 
필요하시면 실무에서 자주 사용하는 그룹 함수 예제, 예를 들면 월별 매출 요약, 카테고리별 사용자 수, 평균 이상 매출 추출 같은 시나리오도 만들어드릴 수 있습니다.
 
어떤 용도로 사용하시려는지 알려주시면, 더 정확한 예제를 설계해드릴 수 있습니다. 도움이 더 필요하신가요? 💡
 
좋은 요청입니다!
Oracle SQL의 **그룹 함수(Group Function)**는 집계 분석의 핵심입니다.
이제 기본 사용 예제부터 시작해서, 고급 기능 및 실무 활용 예제까지 정리해드리겠습니다.
 
 
✅ 기본 사용 예제
 
-- 전체 직원 수, 전체 급여 합계, 평균 급여
SELECT
  COUNT(*) AS 직원수,
  SUM(SALARY) AS 총급여,
  AVG(SALARY) AS 평균급여,
  MAX(SALARY) AS 최고급여,
  MIN(SALARY) AS 최저급여
FROM EMPLOYEE;
 
기초 통계 조회: 전체 데이터를 하나의 그룹으로 보고 요약합니다.
 
 
✅ 그룹별 집계 (GROUP BY)
 
-- 부서별 평균 급여, 직원 수
SELECT
  DEPT_ID,
  AVG(SALARY) AS 평균급여,
  COUNT(*) AS 직원수
FROM EMPLOYEE
GROUP BY DEPT_ID;
 
부서별 통계: DEPT_ID 기준으로 그룹을 나누고 통계를 계산합니다.
 
 
✅ 그룹 필터링 (HAVING 사용)
 
-- 직원 수가 5명 이상인 부서만 조회
SELECT
  DEPT_ID,
  COUNT(*) AS 직원수
FROM EMPLOYEE
GROUP BY DEPT_ID
HAVING COUNT(*) >= 5;
 
HAVING 절은 GROUP BY 이후 필터링 조건입니다 (WHERE은 집계 전).
 
 
✅ 고급 기능 및 실무 예제


▶ 예제 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>
 


서브쿼리를 통해 전체 평균보다 높은 급여를 받는 직원을 조회합니다.
서브쿼리를 통해 전체 평균보다 높은 급여를 받는 직원을 조회합니다.
144번째 줄: 99번째 줄:


▶ 예제 2: 월별 매출 요약
▶ 예제 2: 월별 매출 요약
 
<source lang=sql>
SELECT  
SELECT  
   TO_CHAR(SALE_DATE, 'YYYY-MM') AS 월,
   TO_CHAR(SALE_DATE, 'YYYY-MM') AS 월,
151번째 줄: 106번째 줄:
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()로 날짜를 월 단위로 변환해 그룹핑합니다.
159번째 줄: 114번째 줄:
▶ 예제 3: 부서별 최고 급여자 정보
▶ 예제 3: 부서별 최고 급여자 정보


<source lang=sql>
SELECT *
SELECT *
FROM EMPLOYEE E
FROM EMPLOYEE E
165번째 줄: 121번째 줄:
   FROM EMPLOYEE
   FROM EMPLOYEE
   GROUP BY DEPT_ID
   GROUP BY DEPT_ID
);
);</source>
 


서브쿼리로 부서별 최고 급여를 구하고, 그 조건에 맞는 직원 정보 추출합니다.
서브쿼리로 부서별 최고 급여를 구하고, 그 조건에 맞는 직원 정보 추출합니다.
173번째 줄: 130번째 줄:
▶ 예제 4: 비율(%) 분석
▶ 예제 4: 비율(%) 분석


<source lang=sql>
SELECT  
SELECT  
   DEPT_ID,
   DEPT_ID,
178번째 줄: 136번째 줄:
   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>
 


전체에서 해당 그룹이 차지하는 **구성비(%)**를 계산합니다.
전체에서 해당 그룹이 차지하는 **구성비(%)**를 계산합니다.
186번째 줄: 145번째 줄:


▶ 예제 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번째 줄: 164번째 줄:
   ()
   ()
);
);
</source>


복잡한 다차원 집계가 필요한 리포트에 활용됩니다.
복잡한 다차원 집계가 필요한 리포트에 활용됩니다.


 
=== 요점 정리 ===
✅ 미디어위키 표 요약
 
{| class="wikitable"
{| class="wikitable"
|+ Oracle Group Function 고급 기능 요약
|+ Oracle Group Function 고급 기능 요약

2025년 5월 18일 (일) 01:36 판


menu_book 기본 개념 설명
  • Oracle SQL에서 그룹 함수(Group Functions)는 여러 행(Row)의 값을 그룹으로 묶어 하나의 결과 값으로 요약할 때 사용하는 함수입니다.
  • 주로 GROUP BY절과 함께 사용되며, 집계 함수(Aggregate Functions)라고도 부릅니다.

Oracle의 주요 그룹 함수 종류

Oracle Group Function 종류 및 설명
함수명 설명 예제 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), 
  ()
);

복잡한 다차원 집계가 필요한 리포트에 활용됩니다.

요점 정리

Oracle Group Function 고급 기능 요약
기능명 설명 예제 구문
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 ()