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
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기