PostgreSQL GROUPING SETS절을 사용하여 쿼리에서 여러 그룹화 집합을 생성 하는 방법
GROUP BY절 을 사용하여 그룹화하는 열 집합입니다 .
괄호 안에 배치된 쉼표로 구분된 열 목록으로 표시됩니다.
SELECT
c1,
c2,
aggregate_function(c3)
FROM
table_name
GROUP BY
GROUPING SETS (
(c1, c2),
(c1),
(c2),
()
);
그룹화 기능
GROUPING( column_name | expression)
- column_name이나 expression에 지정된 하나와 일치해야합니다.
- GROUPING인자는 그룹화 세트가 없다면 0을 반환합니다.
-- 새 테이블 생성
DROP TABLE IF EXISTS sales;
CREATE TABLE sales (
brand VARCHAR NOT NULL,
segment VARCHAR NOT NULL,
quantity INT NOT NULL,
PRIMARY KEY (brand, segment)
);
INSERT INTO sales (brand, segment, quantity)
VALUES
('ABC', 'Premium', 100),
('ABC', 'Basic', 200),
('XYZ', 'Premium', 100),
('XYZ', 'Basic', 300);
-- 브랜드 및 세그먼트의 그룹화 집합을 정의
SELECT
brand,
segment,
SUM (quantity)
FROM
sales
GROUP BY
brand,
segment;
-- brand 그룹화 집합
SELECT
brand,
SUM (quantity)
FROM
sales
GROUP BY
brand;
-- 빈 그룹화 집합 정의
SELECT SUM (quantity) FROM sales;
-- UNION ALL을 활용한 모든 쿼리 결합
SELECT
brand,
segment,
SUM (quantity)
FROM
sales
GROUP BY
brand,
segment
UNION ALL
SELECT
brand,
NULL,
SUM (quantity)
FROM
sales
GROUP BY
brand
UNION ALL
SELECT
NULL,
segment,
SUM (quantity)
FROM
sales
GROUP BY
segment
UNION ALL
SELECT
NULL,
NULL,
SUM (quantity)
FROM
sales;
- 모든 그룹화 집합에 대한 집계가 포함된 결과를 반환합니다.
- 하지만 너무나 깁니다.
- sales 각 쿼리에 대해 별도로 스캑해야하기 때문에 성능 이슈도 있습니다.
반응형
이를 개선하기 위해 GROUPING SETS로 정의할 수 있습니다.
1) GROUPING SETS 예
SELECT
brand,
segment,
SUM (quantity)
FROM
sales
GROUP BY
GROUPING SETS (
(brand, segment),
(brand),
(segment),
()
);
2) GROUPING 예
SELECT
GROUPING(brand) grouping_brand,
GROUPING(segment) grouping_segment,
brand,
segment,
SUM (quantity)
FROM
sales
GROUP BY
GROUPING SETS (
(brand),
(segment),
()
)
ORDER BY
brand,
segment;
- grouping_brand이 0일 때 sum열에 의 소계가 표시됩니다.
- grouping_segment이 0이면 합계 열에 segment의 부분합이 표시됩니다.
3) GROUPING HAVING 조합 예
SELECT
GROUPING(brand) grouping_brand,
GROUPING(segment) grouping_segment,
brand,
segment,
SUM (quantity)
FROM
sales
GROUP BY
GROUPING SETS (
(brand),
(segment),
()
)
HAVING GROUPING(brand) = 0
ORDER BY
brand,
segment;
반응형
'SW ENGINEERING > Postgres' 카테고리의 다른 글
[PostgreSQL] BASIC - ROLLUP (0) | 2021.09.03 |
---|---|
[PostgreSQL] BASIC - CUBE (0) | 2021.09.03 |
[PostgreSQL] BASIC - EXCEPT (0) | 2021.09.03 |
[PostgreSQL] BASIC - INTERSECT (0) | 2021.09.03 |
[PostgreSQL] BASIC - UNION (0) | 2021.09.02 |
최근댓글