카테고리:

쿼리 구문

GROUP BY

항목별로 그룹화하는 동일한 식으로 행을 그룹화하고, 결과 그룹에 대한 집계 함수를 계산합니다. GROUP BY 식은 다음과 같을 수 있습니다.

  • 열 이름.

  • SELECT 목록에서 위치를 참조하는 숫자.

  • 일반적인 식입니다.

확장:

GROUP BY CUBE , GROUP BY GROUPING SETS , GROUP BY ROLLUP

구문

SELECT ...
  FROM ...
  [ ... ]
  GROUP BY groupItem [ , groupItem [ , ... ] ]
  [ ... ]
Copy
SELECT ...
  FROM ...
  [ ... ]
  GROUP BY ALL
  [ ... ]
Copy

여기서

GROUP BY groupItem [ , groupItem [ , ... ] ]

그룹화에 사용할 열 별칭, 위치 또는 식을 지정합니다. 각 groupItem 의 경우 다음 구문을 사용하십시오.

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

여기서

  • column_alias 는 쿼리 블록의 SELECT 목록에 나타나는 열 별칭을 지정합니다.

  • positionSELECT 목록에서 식의 위치를 지정합니다.

  • expr 은 현재 범위의 테이블에 대한 식을 지정합니다.

GROUP BY ALL

집계 함수를 사용하지 않는 SELECT 목록의 모든 항목을 그룹화에 사용해야 함을 지정합니다.

예는 모든 열로 그룹화 섹션을 참조하십시오.

사용법 노트

  • GROUP BY 절은 이름 또는 위치별로 프로젝션 절의 식을 참조할 수 있습니다. GROUP BY 절이 이름으로 참조하는 경우 각 참조는 다음과 같이 확인됩니다.

    • 쿼리에 열 이름이 일치하는 데이터베이스 오브젝트(예: 테이블 또는 뷰)가 포함되어 있으면 참조가 열 이름으로 확인됩니다.

    • 그렇지 않고 SELECT의 프로젝션 절에 이름이 일치하는 식 별칭이 포함되어 있으면 참조는 별칭으로 확인됩니다.

    예를 보려면 열 이름과 별칭이 일치하는 경우 우선순위 표시 를 참조하십시오.

  • 모든 SELECT 항목이 집계 함수를 사용하는 경우 GROUP BY ALL을 지정하는 것은 GROUP BY 절 없이 문을 지정하는 것과 같습니다.

    예를 들어, 다음 문에는 집계 함수를 사용하는 SELECT 항목만 있습니다.

    SELECT SUM(amount)
      FROM mytable
      GROUP BY ALL;
    
    Copy

    위의 문은 GROUP by 절을 지정하지 않는 것과 같습니다.

    SELECT SUM(amount)
      FROM mytable;
    
    Copy

다음 섹션에서는 GROUP BY 절을 사용하는 예를 제시합니다.

각 섹션의 예에서는 예제를 위한 데이터 설정하기 에서 설정한 데이터를 사용합니다.

예제를 위한 데이터 설정하기

이 섹션의 예에서는 sales 라는 테이블과 product 라는 테이블을 사용합니다. 이러한 테이블을 만들고 예제에 필요한 데이터를 삽입하려면 다음 문을 실행하십시오.

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

CREATE TABLE products (
  product_ID INTEGER,
  wholesale_price REAL);
INSERT INTO products (product_ID, wholesale_price) VALUES (1, 1.00);
INSERT INTO products (product_ID, wholesale_price) VALUES (2, 2.00);
Copy

한 열로 그룹화

이 예에서는 product_id 로 그룹화된 제품당 총매출을 보여줍니다(즉, 각 제품에 대해 받은 총액).

SELECT product_ID, SUM(retail_price * quantity) AS gross_revenue
  FROM sales
  GROUP BY product_ID;
Copy
+------------+---------------+
| PRODUCT_ID | GROSS_REVENUE |
+============+===============+
|          1 |          6    |
+------------+---------------+
|          2 |        620    |
+------------+---------------+

다음 예에서는 이전 예를 기반으로 하여 product_id 기준으로 그룹화된 제품당 순이익을 보여줍니다.

SELECT p.product_ID, 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 p.product_ID;
Copy
+------------+--------+
| PRODUCT_ID | PROFIT |
+============+========+
|          1 |      3 |
+------------+--------+
|          2 |    372 |
+------------+--------+

여러 열로 그룹화

다음 예에서는 여러 열을 기준으로 그룹화하는 방법을 보여줍니다.

SELECT state, city, SUM(retail_price * quantity) AS gross_revenue
  FROM sales
  GROUP BY state, city;
Copy
+-------+---------+---------------+
| STATE |   CITY  | GROSS REVENUE |
+=======+=========+===============+
|   CA  | SF      |            22 |
+-------+---------+---------------+
|   CA  | SJ      |            44 |
+-------+---------+---------------+
|   FL  | Miami   |            80 |
+-------+---------+---------------+
|   FL  | Orlando |           160 |
+-------+---------+---------------+
|   PR  | SJ      |           320 |
+-------+---------+---------------+

모든 열로 그룹화

다음 예제는 여러 열로 그룹화 에서 사용된 예제와 동일합니다.

SELECT state, city, SUM(retail_price * quantity) AS gross_revenue
  FROM sales
  GROUP BY ALL;
Copy
+-------+---------+---------------+
| STATE |   CITY  | GROSS REVENUE |
+=======+=========+===============+
|   CA  | SF      |            22 |
+-------+---------+---------------+
|   CA  | SJ      |            44 |
+-------+---------+---------------+
|   FL  | Miami   |            80 |
+-------+---------+---------------+
|   FL  | Orlando |           160 |
+-------+---------+---------------+
|   PR  | SJ      |           320 |
+-------+---------+---------------+

열 이름과 별칭이 일치하는 경우 우선순위 표시

열 이름과 일치하는 별칭을 포함하는 쿼리를 만드는 것은 가능합니다(하지만 일반적으로 권장되지 않음).

SELECT x, some_expression AS x
  FROM ...
Copy

GROUP BY 절에 열 이름과 별칭 둘 다와 일치하는 이름이 포함된 경우 GROUP BY 절은 열 이름을 사용합니다. 이는 아래 예에서 나타납니다.

테이블을 만들고 행을 삽입합니다.

Create table employees (salary float, state varchar, employment_state varchar);
insert into employees (salary, state, employment_state) values
    (60000, 'California', 'Active'),
    (70000, 'California', 'On leave'),
    (80000, 'Oregon', 'Active');
Copy

아래 쿼리는 현재 근무 중인 직원의 급여 합계와 휴가 중인 직원 급여 합계를 반환합니다.

select sum(salary), ANY_VALUE(employment_state)
    from employees
    group by employment_state;
+-------------+-----------------------------+
| SUM(SALARY) | ANY_VALUE(EMPLOYMENT_STATE) |
|-------------+-----------------------------|
|      140000 | Active                      |
|       70000 | On leave                    |
+-------------+-----------------------------+
Copy

아래 쿼리는 쿼리에 있는 테이블의 열 이름과 일치하는 별칭 state 를 사용합니다. state 가 GROUP BY에서 사용되면 Snowflake는 이를 별칭이 아닌 열 이름에 대한 참조로 해석합니다. 따라서 이 쿼리는 캘리포니아주에 있는 직원의 급여 합계와 오리건주에 있는 직원 급여의 합계를 반환하지만, 주 또는 지방의 이름 대신 고용 상태 정보(예: 《Active》)를 표시합니다.

select sum(salary), ANY_VALUE(employment_state) as state
    from employees
    group by state;
+-------------+--------+
| SUM(SALARY) | STATE  |
|-------------+--------|
|      130000 | Active |
|       80000 | Active |
+-------------+--------+
Copy