카테고리:

쿼리 구문

PIVOT

입력 식의 한 열에서 고유 값을 여러 열로 변환하고, 필요한 경우 나머지 열 값에 대해 결과를 집계하여 테이블을 회전합니다. 쿼리에서 테이블 이름 또는 하위 쿼리 뒤에 FROM 절에 지정됩니다.

연산자는 기본 제공 집계 함수 AVG, COUNT, MAX, MIN, SUM 을 지원합니다.

PIVOT은 좁은 테이블(예: empid, month, sales)을 더 넓은 테이블(예: empid, jan_sales, feb_sales, mar_sales)로 변환하는 데 사용할 수 있습니다.

참고 항목:

UNPIVOT

구문

SELECT ...
FROM ...
   PIVOT ( <aggregate_function> ( <pivot_column> )
            FOR <value_column> IN ( <pivot_value_1> [ , <pivot_value_2> ... ] ) )

[ ... ]
Copy
aggregate_function

pivot_column 에서 그룹화된 값을 결합하기 위한 집계 함수입니다.

pivot_column

집계될 소스 테이블 또는 하위 쿼리의 열입니다.

value_column

열 이름이 생성될 값이 포함된 소스 테이블 또는 하위 쿼리의 열입니다.

pivot_value_N

쿼리 결과에서 머리글로 피벗할 피벗 열의 값 목록입니다.

다음 구조를 가진 monthly_sales 테이블이 주어질 때 amount 열을 중심으로 피벗하여, 지정된 월의 직원당 총 판매액을 합산합니다.

CREATE OR REPLACE TABLE monthly_sales(empid INT, amount INT, month TEXT)
    AS SELECT * FROM VALUES
    (1, 10000, 'JAN'),
    (1, 400, 'JAN'),
    (2, 4500, 'JAN'),
    (2, 35000, 'JAN'),
    (1, 5000, 'FEB'),
    (1, 3000, 'FEB'),
    (2, 200, 'FEB'),
    (2, 90500, 'FEB'),
    (1, 6000, 'MAR'),
    (1, 5000, 'MAR'),
    (2, 2500, 'MAR'),
    (2, 9500, 'MAR'),
    (1, 8000, 'APR'),
    (1, 10000, 'APR'),
    (2, 800, 'APR'),
    (2, 4500, 'APR');
Copy

쿼리 및 출력:

SELECT * 
  FROM monthly_sales
    PIVOT(SUM(amount) FOR MONTH IN ('JAN', 'FEB', 'MAR', 'APR'))
      AS p
  ORDER BY EMPID;
+-------+-------+-------+-------+-------+
| EMPID | 'JAN' | 'FEB' | 'MAR' | 'APR' |
|-------+-------+-------+-------+-------|
|     1 | 10400 |  8000 | 11000 | 18000 |
|     2 | 39500 | 90700 | 12000 |  5300 |
+-------+-------+-------+-------+-------+
Copy

따옴표가 없는 열 이름을 선호하거나, 입력과는 다른 열 이름을 출력에 사용하려는 경우, 아래와 같이 AS 절에 열 이름을 포함할 수 있습니다.

SELECT * 
  FROM monthly_sales
    PIVOT(SUM(amount) FOR MONTH IN ('JAN', 'FEB', 'MAR', 'APR'))
      AS p (EMP_ID_renamed, JAN, FEB, MAR, APR)
  ORDER BY EMP_ID_renamed;
+----------------+-------+-------+-------+-------+
| EMP_ID_RENAMED |   JAN |   FEB |   MAR |   APR |
|----------------+-------+-------+-------+-------|
|              1 | 10400 |  8000 | 11000 | 18000 |
|              2 | 39500 | 90700 | 12000 |  5300 |
+----------------+-------+-------+-------+-------+
Copy

또는:

SELECT EMPID AS EMP_ID, "'JAN'" AS JANUARY, "'FEB'" AS FEBRUARY, "'MAR'" AS MARCH,
    "'APR'" AS APRIL
  FROM monthly_sales
    PIVOT(sum(amount) FOR MONTH IN ('JAN', 'FEB', 'MAR', 'APR')) 
      AS p
  ORDER BY EMPID;
+--------+---------+----------+-------+-------+
| EMP_ID | JANUARY | FEBRUARY | MARCH | APRIL |
|--------+---------+----------+-------+-------|
|      1 |   10400 |     8000 | 11000 | 18000 |
|      2 |   39500 |    90700 | 12000 |  5300 |
+--------+---------+----------+-------+-------+
Copy