본 게시물은 개인적인 의견으로 작성되었으니 절대적인 정보가 아닐 수 있습니다. 참고만 하시고 궁금한 사항이 있으시면 연락주세요.

티스토리 뷰

SQL Server - CATEGORY

PIVOT and UNPIVOT in SQL Server

AWS-in 2016. 4. 15. 09:31

PIVOT and UNPIVOT in SQL Server

 

T-SQL 에서 집계처리할 때 많이 사용된다.

이런 기능이 없었을땐 CASE 문으로 처리를 했었는데 아주 편한 기능이다.

요즘은 스크립트를 만들지 않아서 자주 까먹기에 스크랩을 해보자.

 

use tempdb

go

 

-- PIVOT

create table #sales (country_name varchar(100),product_name varchar(100),

sales_date datetime, sales_amount decimal(12,2))

 

insert into #sales (country_name,product_name,sales_date,sales_amount)

select 'India','Television','2012-01-10',35000 union all

select 'India','Mobile','2012-12-19',22000 union all

select 'India','Laptop','2012-04-11',62500 union all

select 'India','Laptop','2013-06-23',45000 union all

select 'India','Television','2012-03-20',45000 union all

select 'India','Television','2013-05-30',56000 union all

select 'India','Mobile','2013-02-22',71200 union all

select 'USA','Television','2012-02-20',3500 union all

select 'USA','Mobile','2012-11-01',2700 union all

 

select 'USA','Laptop','2012-08-19',6500 union all

select 'USA','Laptop','2013-06-23',5000 union all

select 'USA','Television','2012-02-12',4560 union all

select 'USA','Television','2013-06-30',5100 union all

select 'USA','Mobile','2013-006-06',2200

 

 

select * from #sales

 

SELECT product_name,[2012],[2013] from

(select year(sales_date) as sales_year,product_name,sales_amount FROM #sales)

as t

PIVOT(SUM(sales_amount) FOR sales_year IN ([2012],[2013])) AS pivot_table

 

결과를 보면 SELECT 절의 product_name으로 group by 를 하는데 해당 하는 값은 SUM(sales_amount) 이다.

 

비슷하지만 열을 추가하면 아래와 같이 된다.

SELECT country_name,product_name,[2012],[2013],[2014] from

(select year(sales_date) as sales_year, country_name, product_name,

sales_amount FROM #sales)

as t

PIVOT(SUM(sales_amount)

FOR sales_year IN ([2012],[2013],[2014])) AS pivot_table

 

 

-- UNPIVOT

 

create table #marks(student_name varchar(100), English smallint,

Mathematics smallint, Tamil smallint, Science smallint)

insert into #marks(student_name , English, Mathematics, Tamil, Science)

select 'Sankar', 78,91,79,60 union all

select 'Nilesh', 81,90,66,89 union all

select 'Murugan', 94,88,72,90

 

select * from #marks

 

select student_name, subject_name, mark

from #marks s

unpivot

(

mark

for subject_name in (English, Mathematics, Tamil, Science)

) t;

 

 

결론. 언제쓰냐이다. 컬럼명을 실제 행값으로 표현하고 싶을 때, 아니면 반대로 출력하고 싶을 때 사용하면 최고다.

 

 

[참고문서]

PIVOT and UNPIVOT in SQL Server

http://www.sqlservercurry.com/2016/04/pivot-unpivot-tables-sql-server.html

댓글
최근에 올라온 글
최근에 달린 댓글
글 보관함
Total
Today
Yesterday