DataBase
[postgreSQL] [그룹함수] GROUPING SETS, ROLLUP, CUBE
바까
2021. 9. 15. 09:04
반응형
--8)GROUPING SET절
--여러개의 UNION ALL을 이용한 SQL과 같은 결과를 도출할 수 있다.
select C1, C2, 집계함수(C3)
from TABLE_NAME
group by
grouping sets (--grouping set절을 이용하면 한번에 다양한 기준의 컬럼 조합으로 집계를 구할 수 있다.
(C1, C2),
(C1),
(C2),
(),
);
select BRAND, SEGMENT, SUM(QUANTITY)
from sales s
group by
grouping sets
(
(BRAND,SEGMENT), --BRAND, SEGMENT컬럼 기준으로 합계를 구한다.
(BRAND), --BRAND컬럼 기준으로 합계를 구한다.
(SEGMENT), --SEGMENT컬럼 기준으로 합계를 구한다.
() --테이블 전체를 기준으로 합계를 구한다.
);
--UNION ALL을 이용한경우
--동일한 테이블을 4번이나 사용 -> 성능저하 가능성 높음
--SQL문이 길어짐 -> 복잡함 -> 유지보수가 어려움
select BRAND, SEGMENT, SUM(QUANTITY)
from sales s --BRAND, SEGMENT기준 QUANTITY컬럼의 합계
group by BRAND, segment --BRAND, SEGMENT 컬럼 기준으로 GROUP BY
union all
select BRAND, NULL, SUM(QUANTITY)
from sales s --BRAND기준 QUANTITY컬럼의 합계
group by BRAND --BRAND컬럼 기준으로 GROUP BY
union all
select NULL, SEGMENT, SUM(QUANTITY)
from sales s --SEGMENT기준 QUANTITY컬럼의 합계
group by SEGMENT --BSEGMENT기준 QUANTITY컬럼의 합계
union ALL
select NULL, NULL, SUM(QUANTITY)
from sales s ; --QUANTITY컬럼의 전체 합계
--GROUPING 함수의 활용
--해당 컬럼이 집계에 사용되었으면 0, 그렇지 않으면 1을 리턴한다.
select
GROUPING(BRAND) as GROUPING_BRAND,
GROUPING(SEGMENT) as GROUPING_SEGMENT,
BRAND,
SEGMENT,
SUM(QUANTITY)
from sales s
group by
grouping sets (
(BRAND, SEGMENT),
(BRAND),
(SEGMENT),
()
)
order by BRAND, SEGMENT;
--위와 같은 결과를 더 이쁘게 도출하려면
select
case when grouping(BRAND) = 0 and grouping(SEGMENT) = 0 then '브랜드별+등급별'
when grouping(BRAND) = 0 and grouping(SEGMENT) = 1 then '브랜드별'
when grouping(BRAND) = 1 and grouping(SEGMENT) = 0 then '등급별'
when grouping(BRAND) = 1 and grouping(SEGMENT) = 1 then '전체합계'
else ''
end as "집계기준",
BRAND,
SEGMENT,
SUM(QUANTITY)
from sales s
group by
grouping sets (
(BRAND, SEGMENT),
(BRAND),
(SEGMENT),
()
)
order by BRAND, SEGMENT;
--9)ROLL UP절
--지정된 GROUPING 컬럼의 소계를 생성하는데 사용된다. 간단한 문법으로 다양한 소계를 출력할 수 있다.
--ROLLUP 절 문법
select C1, C2, C3, 집계함수(C4)
from TABLE_NAME
group by
rollup(C1,C2,C3);
--소계를 생성할 컬럼을 지정한다. 컬럼 지정 순서에 따라 결과값이 달라질 수 있다.
--(제일 앞에 놓인 것에 소계를 구함)
select C1, C2, C3, 집계함수(C4)
from TABLE_NAME
group by C1
rollup (C2,C3);
--특정 컬럼은 제외한 부분적인 ROLLUP도 가능하다.
select BRAND, SEGMENT, SUM(QUANTITY)
from sales s
group by BRAND, SEGMENT
order by BRAND, SEGMENT;
select BRAND, SEGMENT, SUM(QUANTITY)
from sales s
group by ROLLUP(BRAND, SEGMENT)
order by BRAND, SEGMENT;
--GROUP BY별 합계 + ROLLUP절에 맨앞에 쓴 컬럼 기준의 합계도 나오고 + 전체합계도 나온다.
--부분 롤업
select BRAND, SEGMENT, SUM(QUANTITY)
from sales s
group by SEGMENT, rollup (BRAND)
order by BRAND, SEGMENT;
--부분 롤업 = GROUP BY별 합계 + 맨 앞에 쓴 컬럼 기준의 합계 - 하지만 전체합계는 나오지 않는다.
--10)CUBE절
--지정된 GROUPING 컬럼의 다차원 소계를 생성하는데 사용된다.
--간단한 문법으로 다차원 소계를 출력 할 수 있다.
select C1, C2, C3, 집계함수(C4)
from TABLE_NAME
group by
cube (C1, C2, C3); --CUBE절에서 다차원 소계를 할 열을 지정한다.
--(지정한 그룹의 모든 경우에 수에 대한 소계와 총계를 구한다.)
select C1, C2, C3, 집계함수(C4)
from TABLE_NAME
group by C1,
cube (C2, C3); --특정 컬럼만 분리하여 cube 지정을 할 수 있다.
--CUBE(C1,C2,C3)를 GROUPING SETS으로 표현하면 총 8개의 소계가 발생
CUBE(C1,C2,C3)
->
grouping SETS(
(C1,C2,C3),
(C1,C2),
(C1,C3),
(C2,C3),
(C1),
(C2),
(C3),
()
);
--CUBE절 내 인자의 개수가 3개이면 2의 3승의 소계가 발생하게 된다. 즉 8개의 소계가 발생
select BRAND, SEGMENT, SUM(QUANTITY)
from SALES
group by CUBE(BRAND,SEGMENT)
order by BRAND, SEGMENT;
--CUBE = GROUP BY 절 합계 + BRAND별 + SEGMENT별 + 전체합계
--부분 큐브
select BRAND, SEGMENT, SUM(QUANTITY)
from SALES
group by BRAND, CUBE(SEGMENT)
order by BRAND, SEGMENT;
--부분큐브 = GROUP BY별 합계 + 맨 앞에 쓴 컬럼별 합계
-- = 뒤에 쓴 컬럼이랑 전체합계는 구하지 않는다.
반응형