- 카테고리:
GROUP BY CUBE¶
GROUP BY CUBE는 /sql-reference/constructs/group-by-rollup`과 유사한 :doc:/sql-reference/constructs/group-by` 절의 확장명입니다. ROLLUP과 마찬가지로, CUBE는 여러 수준에서 집계된 행을 생성합니다. 그러나 ROLLUP은 자연스러운 계층 구조를 따르는 집계를 생성(예: 도시는 주로 롤업되고 주는 국가로 롤업됨)하는 반면, CUBE는 지정된 열의 가능한 모든 조합에 대한 집계를 생성합니다. 여기에는 ROLLUP이 생성하는 계층적 집계 및 각 개별 차원에 걸쳐 독립적으로 집계하는 추가 “교차 테이블” 행이 모두 포함됩니다.
CUBE은 다른 GROUP BY 식과 결합할 수 있습니다. 예를 들어 GROUP BY x, CUBE(y, z)`를 작성하여 ``x` 열을 기준으로 그룹화하고 y 및 ``z``에 대한 큐브 집계와 결합할 수 있습니다.
CUBE 그룹화는 일련의 그룹화 세트와 동일하며, 본질적으로는 더 짧은 사양입니다. CUBE 사양의 N 요소는 2^N GROUPING SETS 에 해당합니다.
참고 항목¶
:doc:`/sql-reference/functions/grouping`(각 행을 생성한 그룹화 수준을 식별하는 유틸리티 함수)
구문¶
SELECT ...
FROM ...
[ ... ]
GROUP BY [ groupItem [ , groupItem [ , ... ] ] , ] CUBE ( groupItem [ , groupItem [ , ... ] ] )
[ ... ]
여기서:
groupItem ::= { <column_alias> | <position> | <expr> }
매개 변수¶
사용법 노트¶
Snowflake는 각 큐브에 최대 7개의 요소(128개의 그룹화 세트에 해당)를 허용합니다.
예¶
다양한 도시와 주/지역에 지점이 있는 체인점의 판매 정보가 포함된 테이블을 만들고 로딩하는 것으로 시작합니다.
-- Create some tables and insert some rows. CREATE TABLE products (product_ID INTEGER, wholesale_price REAL); INSERT INTO products (product_ID, wholesale_price) VALUES (1, 1.00), (2, 2.00); CREATE TABLE sales (product_ID INTEGER, retail_price REAL, quantity INTEGER, city VARCHAR, state VARCHAR); INSERT INTO sales (product_id, retail_price, quantity, city, state) VALUES (1, 2.00, 1, 'SF', 'CA'), (1, 2.00, 2, 'SJ', 'CA'), (2, 5.00, 4, 'SF', 'CA'), (2, 5.00, 8, 'SJ', 'CA'), (2, 5.00, 16, 'Miami', 'FL'), (2, 5.00, 32, 'Orlando', 'FL'), (2, 5.00, 64, 'SJ', 'PR');
모든 주에서 시, 주, 합계별로 이익을 표시하는 큐브 쿼리를 실행합니다. 아래 예는 세 가지 “수준”이 있는 쿼리를 보여줍니다.
각 도시.
각 주.
합산된 모든 수익.
이 예는 ORDER BY state, city NULLS LAST 를 사용하여 각 주의 롤업이 해당 주의 모든 도시 바로 뒤에 오고, 최종 롤업이 출력 끝에 표시되도록 합니다.
SELECT state, city, SUM((s.retail_price - p.wholesale_price) * s.quantity) AS profit FROM products AS p, sales AS s WHERE s.product_ID = p.product_ID GROUP BY CUBE (state, city) ORDER BY state, city NULLS LAST ; +-------+---------+--------+ | STATE | CITY | PROFIT | |-------+---------+--------| | CA | SF | 13 | | CA | SJ | 26 | | CA | NULL | 39 | | FL | Miami | 48 | | FL | Orlando | 96 | | FL | NULL | 144 | | PR | SJ | 192 | | PR | NULL | 192 | | NULL | Miami | 48 | | NULL | Orlando | 96 | | NULL | SF | 13 | | NULL | SJ | 218 | | NULL | NULL | 375 | +-------+---------+--------+
일부 롤업 행에는 NULL 값이 포함되어 있습니다. 예를 들어, 테이블의 마지막 행에는 데이터가 특정 도시 및 주가 아니라 모든 도시 및 주에 관한 것이기 때문에 시에 대한 NULL 값과 주에 대한 NULL 값이 포함됩니다.
GROUPING 유틸리티 함수는 큐브 집계의 결과인 NULL 값과 데이터의 실제 NULL 값을 구분하는 데 도움이 될 수 있습니다.
GROUP BY CUBE 및 GROUP BY ROLLUP은 모두 각 도시/주 쌍에 대해 하나의 행을 생성하며, GROUP BY 절은 모두 각 개별 주 및 모든 주가 결합된 롤업 행도 생성합니다. 두 GROUP BY 절 간의 차이는 GROUP BY CUBE는 각 도시 이름(Miami, SJ 등)에 대한 출력 행도 생성한다는 점입니다.
계층적 데이터에 GROUP BY CUBE를 사용하는 경우에는 주의하세요. 이 예제에서 SJ 행에는 CA 주의 SJ``라는 도시 및 ``PR 지역의 ``SJ``라는 도시 모두에 대한 합계가 포함되어 있습니다. 이러한 도시 간의 유일한 관계는 이름이 동일하다는 것뿐입니다. 일반적으로 계층적 데이터 분석에는 GROUP BY ROLLUP을 사용하고 독립적인 축 전반에 걸친 데이터 분석에는 GROUP BY CUBE를 사용합니다.