[SQL] 그룹 함수를 사용하여 집계된 데이터 보고

·2025년 5월 25일
0

SQL

목록 보기
5/126

📌

5 SELECT : 검색 대상 컬럼(표현식)
1 FROM : 검색 대상 집합
2 WHERE : 행 제한을 위한 조건식
3 GROUP BY : 그룹 생성
4 HAVING : 그룹 제한을 위한 조건식
6 ORDER BY : 정렬

📌 쿼리의 작동 순서

FROM
-> WHERE
-> GROUP BY
-> HAVING
-> SELECT
-> ORDER BY

그룹함수

AVG
COUNT
MAX
MIN
SUM
LISTAGG
STDDEV
VARIANCE

  • 그룹함수 연산에서는 null 값을 연산에서 제외
  • null 포함하려면 -> NVL함수 사용
  • 중복값을 제거하고 연산하려면 -> distinct 함수 사용
  • 그룹함수를 사용할 수 있는 데이터 타입이 있으므로 꼭 확인하기
SELECT SUM(order_total), AVG(order_total), MAX(order_total), MIN(order_total)
  FROM orders ; 

SELECT COUNT(*)
FROM   employees
WHERE  department_id = 50;

SELECT COUNT(commission_pct)
FROM   employees
WHERE  department_id = 50;

SELECT COUNT(DISTINCT department_id)
FROM   employees;


SELECT SUM(commission_pct)/COUNT(*)
	  ,AVG(NVL(commission_pct,0))
      ,AVG(commission_pct)
	  ,SUM(commission_pct)/COUNT(commission_pct)
  FROM employees ;

데이터 그룹 생성: GROUP BY 절

SELECT ...
FROM ...
[WHERE ...][GROUP BY ...]
[ORDER BY ...]

⚠️ 그룹함수에 속하지 않는 SELECT list의 모든 열은 GROUP BY절에 있어야 됨!

SELECT department_id, SUM(salary)
  FROM employees
GROUP BY department_id ;

-- 예를들어, 여기서 GROUP BY절에 job_id가 없으면 오류남
SELECT department_id, job_id, SUM(salary)
  FROM employees 
GROUP BY department_id, job_id ;

-- 오류 발생 (GROUP BY절에 department_id 써줘야됨)
SELECT department_id, SUM(salary)
  FROM employees ;

⚠️ GROUP BY 열은 SELECT list에 없어도 됨

  • group by절로 불러왔을 때의 값만 select절에서 호출 가능!
SELECT   AVG(salary)
FROM     employees
GROUP BY department_id;

그룹 함수를 사용한 잘못된 query

1.

  • 집계함수가 아닌 SELECT list의 열이나 표현식은 GROUP BY절에 있어야 됨
-- 오류발생
-- group by절을 추가해줘야 함
select department_id, count(last_name)
from employees;

-- 오류발생
-- group by에서 job_id를 추가하거나, select list에서 job_id를 제거해야함
select department_id, job_id, count(last_name)
from employees
group by department_id;

2.

  • WHERE절은 그룹을 제한하는데 사용할 수 X
  • 그룹을 제한하려면 HAVING절 사용
  • WHERE절에서 그룹함수 사용 할 수 X
-- 오류 발생 (WHERE절에서 그룹함수 사용 할 수 X)
-- (해결법: HAVING절 사용해주기)
SELECT   department_id, AVG(salary)
FROM     employees
WHERE    AVG(salary) > 8000
GROUP BY department_id;

HAVING절을 사용하여 그룹 결과 제한

HAVING절을 사용할 경우, Oracle 서버는 다음과 같이 그룹을 제한함
1. 행이 그룹화 됨
2. 그룹함수가 적용됨
3. HAVING절과 일치하는 그룹이 표시됨

SELECT ...
FROM ...
[WHERE ...][GROUP BY ...]
[HAVING ...][ORDER BY ...]

SELECT   department_id, MAX(salary)
FROM     employees
GROUP BY department_id
HAVING   MAX(salary)>10000 ;

SELECT   job_id, SUM(salary) PAYROLL
FROM     employees
WHERE    job_id NOT LIKE '%REP%'
GROUP BY job_id
HAVING   SUM(salary) > 13000
ORDER BY SUM(salary);

그룹함수 중첩

⚠️ 그룹함수는 딱 한번만 중첩 가능

SELECT   MAX(AVG(salary))
FROM     employees
GROUP BY department_id;

-- 오류발생
SELECT   SUM(MAX(AVG(salary)))
FROM     employees
GROUP BY department_id;

-- 이런 식으로 단일행 함수 중첩은 상관 없음
SELECT   ROUND(MAX(AVG(salary)))
FROM     employees
GROUP BY department_id;

0개의 댓글