카테고리:

쿼리 구문

UNPIVOT

열을 행으로 변환하여 테이블을 회전합니다. UNPIVOT은 관계형 연산자로, 열 목록과 함께 테이블 또는 하위 쿼리에서 두 열을 허용하고, 목록에 지정된 각 열에 대해 행을 생성합니다. 쿼리에서 테이블 이름 또는 하위 쿼리 뒤에 FROM 절에 지정됩니다.

UNPIVOT은 PIVOT이 만든 집계를 취소할 수 없기 때문에 PIVOT과 정확히 반대되는 동작을 수행하는 것은 아닙니다.

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

참고 항목:

PIVOT

구문

SELECT ...
FROM ...
    UNPIVOT [ { INCLUDE | EXCLUDE } NULLS ]
      ( <value_column>
        FOR <name_column> IN ( <column_list> ) )

[ ... ]
Copy

매개 변수

{ INCLUDE | EXCLUDE } NULLS

name_column 에 NULLs가 있는 행을 포함할지 제외할지 지정합니다.

  • INCLUDE NULLS 는 NULLs가 있는 행이 포함됩니다.

  • EXCLUDE NULLS 는 NULLs가 있는 행을 제외합니다.

기본값: EXCLUDE NULLS

value_column

생성된 열에 할당할 이름으로, 열 목록에 있는 열의 값으로 채워집니다.

name_column

생성된 열에 할당할 이름으로, 열 목록에 있는 열의 이름으로 채워집니다.

column_list

단일 피벗 열로 순환할 소스 테이블 또는 하위 쿼리의 열 이름입니다. 열 이름은 name_column 을 채우고 열 값은 value_column 을 채웁니다.

column_list 에는 하위 쿼리가 아닌 리터럴 열 이름만 포함할 수 있습니다.

다음과 같은 구조와 데이터로 테이블 monthly_sales 를 만듭니다.

CREATE OR REPLACE TABLE monthly_sales(
  empid INT,
  dept TEXT,
  jan INT,
  feb INT,
  mar INT,
  apr INT
);

INSERT INTO monthly_sales VALUES
  (1, 'electronics', 100, 200, 300, 100),
  (2, 'clothes', 100, 300, 150, 200),
  (3, 'cars', 200, 400, 100, 50),
  (4, 'appliances', 100, NULL, 100, 50);

SELECT * FROM monthly_sales;
Copy
+-------+-------------+-----+------+------+-----+
| EMPID | DEPT        | JAN | FEB  | MAR  | APR |
|-------+-------------+-----+------+------+-----|
|     1 | electronics | 100 | 200  | 300  | 100 |
|     2 | clothes     | 100 | 300  | 150  | 200 |
|     3 | cars        | 200 | 400  | 100  |  50 |
|     4 | appliances  | 100 | NULL | 100  |  50 |
+-------+-------------+-----+------+------+-----+

개별 월 열의 피벗을 해제하여 각 직원에 대해 month 기준으로 단일 sales 값을 반환합니다.

SELECT *
  FROM monthly_sales
    UNPIVOT (sales FOR month IN (jan, feb, mar, apr))
  ORDER BY empid;
Copy
+-------+-------------+-------+-------+
| EMPID | DEPT        | MONTH | SALES |
|-------+-------------+-------+-------|
|     1 | electronics | JAN   |   100 |
|     1 | electronics | FEB   |   200 |
|     1 | electronics | MAR   |   300 |
|     1 | electronics | APR   |   100 |
|     2 | clothes     | JAN   |   100 |
|     2 | clothes     | FEB   |   300 |
|     2 | clothes     | MAR   |   150 |
|     2 | clothes     | APR   |   200 |
|     3 | cars        | JAN   |   200 |
|     3 | cars        | FEB   |   400 |
|     3 | cars        | MAR   |   100 |
|     3 | cars        | APR   |    50 |
|     4 | appliances  | JAN   |   100 |
|     4 | appliances  | MAR   |   100 |
|     4 | appliances  | APR   |    50 |
+-------+-------------+-------+-------+

이전 SELECT 문은 기본적으로 NULLs를 제외합니다. 따라서 2월의 가전제품에 대한 행은 결과에 포함되지 않습니다. 결과에 NULLs를 포함하려면 다음 SQL 문을 실행합니다.

SELECT *
  FROM monthly_sales
    UNPIVOT INCLUDE NULLS (sales FOR month IN (jan, feb, mar, apr))
  ORDER BY empid;
Copy
+-------+-------------+-------+-------+
| EMPID | DEPT        | MONTH | SALES |
|-------+-------------+-------+-------|
|     1 | electronics | JAN   |   100 |
|     1 | electronics | FEB   |   200 |
|     1 | electronics | MAR   |   300 |
|     1 | electronics | APR   |   100 |
|     2 | clothes     | JAN   |   100 |
|     2 | clothes     | FEB   |   300 |
|     2 | clothes     | MAR   |   150 |
|     2 | clothes     | APR   |   200 |
|     3 | cars        | JAN   |   200 |
|     3 | cars        | FEB   |   400 |
|     3 | cars        | MAR   |   100 |
|     3 | cars        | APR   |    50 |
|     4 | appliances  | JAN   |   100 |
|     4 | appliances  | FEB   |  NULL |
|     4 | appliances  | MAR   |   100 |
|     4 | appliances  | APR   |    50 |
+-------+-------------+-------+-------+

이 출력에는 2월의 가전제품에 대한 행이 포함되어 있습니다.

* 로 모든 열을 선택하는 대신, SELECT 목록의 특정 열을 포함하고 UNPIVOT value_columnname_column 을 참조할 수 있습니다. 다음 예는 이전 예와 비슷하지만, SELECT 목록에서 value_column salesname_column month 를 지정합니다. 이 쿼리는 empid 열을 제외합니다.

SELECT dept, month, sales
  FROM monthly_sales
    UNPIVOT INCLUDE NULLS (sales FOR month IN (jan, feb, mar, apr))
  ORDER BY dept;
Copy
+-------------+-------+-------+
| DEPT        | MONTH | SALES |
|-------------+-------+-------|
| appliances  | JAN   |   100 |
| appliances  | FEB   |  NULL |
| appliances  | MAR   |   100 |
| appliances  | APR   |    50 |
| cars        | JAN   |   200 |
| cars        | FEB   |   400 |
| cars        | MAR   |   100 |
| cars        | APR   |    50 |
| clothes     | JAN   |   100 |
| clothes     | FEB   |   300 |
| clothes     | MAR   |   150 |
| clothes     | APR   |   200 |
| electronics | JAN   |   100 |
| electronics | FEB   |   200 |
| electronics | MAR   |   300 |
| electronics | APR   |   100 |
+-------------+-------+-------+