- 카테고리:
PIVOT¶
입력 식의 한 열에서 고유 값을 여러 열로 변환하고, 필요한 경우 나머지 열 값에 대해 결과를 집계하여 테이블을 회전합니다. 쿼리에서 테이블 이름 또는 하위 쿼리 뒤에 FROM 절에 지정됩니다.
연산자는 기본 제공 집계 함수 AVG, COUNT, MAX, MIN, SUM 을 지원합니다.
PIVOT은 좁은 테이블(예: empid
, month
, sales
)을 더 넓은 테이블(예: empid
, jan_sales
, feb_sales
, mar_sales
)로 변환하는 데 사용할 수 있습니다.
- 참고 항목:
구문¶
SELECT ...
FROM ...
PIVOT ( <aggregate_function> ( <pivot_column> )
FOR <value_column> IN ( <pivot_value_1> [ , <pivot_value_2> ... ] ) )
[ ... ]
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');쿼리 및 출력:
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 | +-------+-------+-------+-------+-------+
따옴표가 없는 열 이름을 선호하거나, 입력과는 다른 열 이름을 출력에 사용하려는 경우, 아래와 같이 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 | +----------------+-------+-------+-------+-------+
또는:
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 | +--------+---------+----------+-------+-------+