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),
()
)