SQL 집계 데이터

GROUP BY 절

SELECT 문에 의해 반환된 행을 그룹으로 나누고 그룹별로 합계, 평균, 개수 등을 계산할 수 있습니다.

SELECT COLUMN_1, 집계함수(COLUMN_2)
FROM TABLE_A
GROUP BY COLUMN_1
-- 단순 GROUP BY
select customer_id
from payment
group by customer_id;

-- 아래 SQL문의 실행 결과와 같음
select distinct customer_id 
from payment;
-- 거래액이 가장 많은 고객 순으로 출력
select
	customer_id ,
	sum(amount) as amount_sum
from
	payment
group by customer_id
order by amount_sum desc;

-- 실행 결과 같음
select
	customer_id ,
	sum(amount) as amount_sum
from
	payment
group by customer_id
order by 2 desc;
select 
	s.first_name || ' ' || s.last_name as staff_name,
	pc.count
from staff s
inner join (select
	staff_id ,
	count(payment_id) as count
from
	payment
group by staff_id) pc
on s.staff_id = pc.staff_id;

HAVING 절

GROUP BY 절과 함께 HAVING 절을 사용하면 특정 조건으로 GROUP BY 결과를 필터링합니다.

SELECT COLUMN_1, 집계함수(COLUMN_2)
FROM TABLE_A
GROUP BY COLUMN_1
HAVING 조건식;

WHERE 절과의 차이점

  • HAVING 절은 GROUP BY 절에 의해 생성된 그룹 행에 대한 조건을 설정합니다.

  • 반면에 WHERE 절은 GROUP BY 절이 적용되기 전에 개별 행에 조건을 설정합니다.

-- 예시
select
	customer_id ,
	sum(amount) as amount_sum
from
	payment
group by customer_id
having sum(amount) >= 200;

GROUPING SET 절

GROUPING SET 절을 사용하면 여러 UNION ALL을 사용할 때 SQL에서와 동일한 효과를 얻을 수 있습니다.

SELECT C1, C2, 집계합수(C3)
FROM TABLE_A
GROUP BY
GROUPING SETS
(
    (C1, C2),
    (C1),
    (C2),
);

롤업 절

지정된 GROUPING 열에 대한 소계를 생성하는 데 사용됩니다.

SELECT C1, C2, C3, 집계함수(C4)
FROM TABLE_A
GROUP BY
ROLLUP (C1, C2, C3);

-- 부분 ROLLUP 가능
SELECT C1, C2, C3, 집계함수(C4)
FROM TABLE_A
GROUP BY C1
ROLLUP (C2, C3);

CUBE 절

SELECT C1, C2, C3, 집계함수(C4)
FROM TABLE_A
GROUP BY
CUBE (C1, C2, C3);

-- 부분 CUBE 가능
SELECT C1, C2, C3, 집계함수(C4)
FROM TABLE_A
GROUP BY C1
CUBE (C2, C3);
  • CUBE(C1, C2, C3)는 다음과 같습니다.

GROUPING SETS (
    (C1,C2,C3),
    (C1,C2),
    (C1,C3),
    (C2,C3),
    (C1),
    (C2),
    (C3),
    ()
)