카테고리:

쿼리 구문

GROUP BY

항목별로 그룹화하는 동일한 식으로 행을 그룹화하고, 결과 그룹에 대한 집계 함수를 계산합니다. GROUP BY 식은 열 이름이거나, SELECT 목록의 위치를 참조하는 숫자이거나, 일반 식일 수 있습니다.

확장:

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

구문

SELECT ...
FROM ...
[ ... ]
GROUP BY groupItem [ , groupItem> [ , ... ] ]
[ ... ]

여기서:

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

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

position

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

expr

현재 범위의 테이블에 대한 모든 식입니다.

사용법 노트

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

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

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

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

한 열로 그룹화

이 예는 product_id 기준으로 그룹화된 제품당 총수익을 보여줍니다.

-- Create the sales table and insert some rows.
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');

-- Show the gross revenue, grouped by product_id.
-- In other words, show the total amount of money received for
-- selling each product.
SELECT product_ID, SUM(retail_price * quantity) AS gross_revenue
  FROM sales
  GROUP BY product_ID;

출력:

+------------+---------------+
| PRODUCT_ID | GROSS_REVENUE |
+============+===============+
|          1 |          6    |
+------------+---------------+
|          2 |        620    |
+------------+---------------+

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

-- Create the products table and insert some rows.
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);

-- Show the net profit on each product.
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;

출력:

+------------+--------+
| PRODUCT_ID | PROFIT |
+============+========+
|          1 |      3 |
+------------+--------+
|          2 |    372 |
+------------+--------+

여러 열로 그룹화

여러 열을 기준으로 그룹화할 수 있습니다.

SELECT State, City, SUM(retail_price * quantity) AS gross_revenue
 FROM sales
 GROUP BY State, City;

출력:

+-------+---------+---------------+
| 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 ...

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

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

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

아래 쿼리는 쿼리에 있는 테이블의 열 이름과 일치하는 별칭 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 |
+-------------+--------+
맨 위로 이동