- 카테고리:
 
UNPIVOT¶
열을 행으로 변환하여 테이블을 회전합니다. UNPIVOT은 관계형 연산자로, 열 목록과 함께 테이블 또는 하위 쿼리에서 두 열을 허용하고, 목록에 지정된 각 열에 대해 행을 생성합니다. 쿼리에서 테이블 이름 또는 하위 쿼리 뒤에 FROM 절에 지정됩니다.
UNPIVOT은 PIVOT이 만든 집계를 취소할 수 없기 때문에 PIVOT과 정확히 반대되는 동작을 수행하는 것은 아닙니다.
이 연산자는 넓은 테이블(예: empid, jan_sales, feb_sales, mar_sales)을 더 좁은 테이블(예: empid, month, sales)로 변환하는 데 사용할 수 있습니다.
- 참고 항목:
 
구문¶
SELECT ...
FROM ...
    UNPIVOT [ { INCLUDE | EXCLUDE } NULLS ]
      ( <value_column>
        FOR <name_column> IN ( <column_list> ) )
[ ... ]
매개 변수¶
{ INCLUDE | EXCLUDE } NULLSname_column에 NULLs가 있는 행을 포함할지 제외할지 지정합니다.INCLUDE NULLS는 NULLs가 있는 행이 포함됩니다.EXCLUDE NULLS는 NULLs가 있는 행을 제외합니다.
기본값:
EXCLUDE NULLSvalue_column생성된 열에 할당할 이름으로, 열 목록에 있는 열의 값으로 채워집니다.
name_column생성된 열에 할당할 이름으로, 열 목록에 있는 열의 이름으로 채워집니다.
column_list단일 피벗 열로 순환할 소스 테이블 또는 하위 쿼리의 열 이름입니다. 열 이름은
name_column을 채우고 열 값은value_column을 채웁니다.column_list에는 하위 쿼리가 아닌 리터럴 열 이름만 포함할 수 있습니다.column_list의 열은 다음과 같은 예외를 제외하고 정확히 동일한 데이터 타입을 가져야 합니다.텍스트 문자열 의 데이터 타입은 길이가 다를 수 있습니다.
열에 텍스트 문자열이 포함된 경우 열마다 텍스트에 다른 데이터 타입을 사용할 수 있습니다. 예를 들어, 목록에 VARCHAR 열과 CHAR 열을 포함할 수 있습니다.
예¶
다음과 같은 구조와 데이터로 테이블 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;
+-------+-------------+-----+------+------+-----+
| 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;
+-------+-------------+-------+-------+
| 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;
+-------+-------------+-------+-------+
| 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_column 및 name_column 을 참조할 수 있습니다. 다음 예는 이전 예와 비슷하지만, SELECT 목록에서 value_column sales 와 name_column month 를 지정합니다. 이 쿼리는 empid 열을 제외합니다.
SELECT dept, month, sales
  FROM monthly_sales
    UNPIVOT INCLUDE NULLS (sales FOR month IN (jan, feb, mar, apr))
  ORDER BY dept;
+-------------+-------+-------+
| 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 |
+-------------+-------+-------+