카테고리:

쿼리 구문

GROUP BY CUBE

GROUP BY CUBE는 GROUP BY ROLLUP 과 유사한 GROUP BY 절의 확장입니다. GROUP BY ROLLUP 의 모든 행을 생성하는 것 외에도 GROUP BY CUBE는 모든 《크로스탭》 행을 추가합니다. 소계 행은 그룹화된 행을 생성하는 데 사용된 동일한 집계 함수를 계산함으로써 파생된 값을 추가로 집계하는 행입니다.

CUBE 그룹화는 일련의 그룹화 세트와 동일하며, 본질적으로는 더 짧은 사양입니다. CUBE 사양의 N 요소는 2^N GROUPING SETS 에 해당합니다.

참고 항목:

GROUP BY GROUPING SETS , GROUP BY ROLLUP

구문

SELECT ...
FROM ...
[ ... ]
GROUP BY CUBE ( groupCube [ , groupCube [ , ... ] ] )
[ ... ]
Copy

여기서:

groupCube ::= { <column_alias> | <position> | <expr> }
Copy
column_alias

쿼리 블록의 SELECT 목록에 나타나는 열 별칭입니다.

position

SELECT 목록에서 식의 위치입니다.

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');
Copy

모든 주에서 시, 주, 합계별로 이익을 표시하는 큐브 쿼리를 실행합니다. 아래 예는 세 가지 《수준》이 있는 쿼리를 보여줍니다.

  • 각 도시.

  • 각 주.

  • 합산된 모든 수익.

이 예는 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 |
+-------+---------+--------+
Copy

일부 롤업 행에는 NULL 값이 포함되어 있습니다. 예를 들어, 테이블의 마지막 행에는 데이터가 특정 도시 및 주가 아니라 모든 도시 및 주에 관한 것이기 때문에 시에 대한 NULL 값과 주에 대한 NULL 값이 포함됩니다.

GROUP BY CUBEGROUP 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 를 사용하여 독립 축의 데이터를 분석합니다.