- 카테고리:
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 } 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;
+-------+-------------+-----+------+------+-----+
| 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 |
+-------------+-------+-------+