-
[PostgreSQL] GROUPING SETS/ CUBE/ ROLLUPSQL 2021. 8. 18. 00:44
그룹화 집합을 여러개 만들기 위한 함수
GROUPING SETS / CUBE / ROLLUP
- GROUPING SETS
group by + union all + group by + union all + group by 같이 그룹화된 각 쿼리 결과를 union을 사용해서 하나의 결과로 결합해야 할 때, 쿼리문이 길어지고 쿼리문을 각각 연산해야 하는 문제가 발생합니다. 이러한 문제를 보완하기 위해 GROUPING SETS 을 사용하면 한 번에 그룹화된 쿼리 결과 집합을 생성할 수 있습니다.
SELECT c1, c2, aggregate_function(c3) FROM table_name GROUP BY GROUPING SETS ( (c1, c2), (c1), (c2), () );
- Example - 국가별 고객 수, 도시별 고객 수, 전체 고객 수 구하기 (PostgreSQL sample database 사용)
SELECT country, city, COUNT(c.customer_id) FROM customer c JOIN address a ON c.address_id = a.address_id JOIN city c2 ON a.city_id = c2.city_id JOIN country c3 ON c2.country_id = c3.country_id GROUP BY GROUPING SETS ( (country), (city), () )
- CUBE
CUBE는 ( ) 속에 지정된 칼럼으로 조합이 가능한 모든 그룹화 집합을 간단하게 생성할 수 있습니다.
SELECT c1, c2, c3, aggregate (c4) FROM table_name GROUP BY CUBE (c1, c2, c3);
아래 CUBE 절과 GROUPING SETS 절은 같은 결과를 반환합니다.
모든 그룹 집합을 만들 때는 GROUPING SETS 보다 CUBE를 이용하면 간단하고 보기 좋게 쿼리를 작성할 수 있습니다.
CUBE(c1,c2,c3) GROUPING SETS ( (c1,c2,c3), (c1,c2), (c1,c3), (c2,c3), (c1), (c2), (c3), () )
- Example - 국가별 도시별 고객수, 국가별 고객수, 도시별 고객수, 전체 고객수 구하기 (PostgreSQL sample database 사용)
SELECT country, city, COUNT(c.customer_id) FROM customer c JOIN address a ON c.address_id = a.address_id JOIN city c2 ON a.city_id = c2.city_id JOIN country c3 ON c2.country_id = c3.country_id GROUP BY CUBE (country, city)
- ROLLUP
그룹화된 집합을 생성하는데 CUBE가 모든 하위 집합을 생성한다면, ROLLUP은 입력된 칼럼의 계층 구조를 고려하여 하위 집합을 생성합니다. ROLLUP(c1,c2,c3)는 계층 구조가 c1 > c2 > c3 와 같다고 가정하고 하위 집합 생성하는 것입니다. 간단하게 c1, c2, c3를 Year, Month, Day 예시로 들어볼 수 있습니다.
SELECT c1, c2, c3, aggregate(c4) FROM table_name GROUP BY ROLLUP (c1, c2, c3);
ROLLUP(c1,c2,c3) (c1, c2, c3) (c1, c2) (c1) ()
- Example - 국가당 도시별 매출액, 국가별 매출액, 전체 매출액 구하기 (PostgreSQL sample database 사용)
SELECT country, city, SUM(amount) FROM payment p JOIN customer c ON p.customer_id = c.customer_id JOIN address a ON c.address_id = a.address_id JOIN city c2 ON a.city_id = c2.city_id JOIN country c3 ON c2.country_id = c3.country_id GROUP BY ROLLUP(country, city)
https://www.postgresqltutorial.com
PostgreSQL Tutorial - Learn PostgreSQL from Scratch
Welcome to the PostgreSQLTutorial.com website! This PostgreSQL tutorial helps you understand PostgreSQL quickly. You’ll master PostgreSQL very fast through many practical examples and apply the knowledge in developing applications using PostgreSQL. If yo
www.postgresqltutorial.com
'SQL' 카테고리의 다른 글
[PostgreSQL] 데이터 타입 변환 - CAST, :: 연산자 (0) 2021.08.26 [PostgreSQL] NULL 값 대체하기 - COALESCE (0) 2021.08.24 [PostgreSQL] UNION/ INTERSECT/ EXCEPT (0) 2021.08.11 [SQL] SQL Query 쿼리문 (3) - CASE, SubQuery(feat. IN, EXISTS) (0) 2021.07.26 [MySQL] 프로그래머스 SQL 고득점 Kit - String, Date (0) 2021.07.11