PIVOT and UNPIVOT are aggregate operators which are available from SQL Server version 2005 onwards.
PIVOT can be used to transform rows into columns while UNPIVOT can be used to transform columns into rows. We will see how to use PIVOT and UNPIVOT in the following examples
Let us create the following table which has sales details of products for each country.
If you want to group it by multiple columns, you can simply include that column in the query. For example the following query will do pivot group by country_name and product_name
Suppose you want to transform the columns into rows i.e. subjects become rows, use the following query:
Note : PIVOT in SQL Server basically produces a denormalised dataset whereas UNPIVOT produces normalised dataset.
PIVOT can be used to transform rows into columns while UNPIVOT can be used to transform columns into rows. We will see how to use PIVOT and UNPIVOT in the following examples
Let us create the following table which has sales details of products for each country.
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
SQL Server PIVOT table Example
Suppose you want to find out the total sales by each product and summarised for each year (ie columns are years). You can use the following codeSELECT 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
If you want to group it by multiple columns, you can simply include that column in the query. For example the following query will do pivot group by country_name and product_name
SELECT country_name,product_name,[2012],[2013] 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])) AS pivot_table
SQL Server UnPivot Table Example
To see how unpivot works, let us create the following tablecreate 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 student_name, subject_name, mark from #marks s unpivot ( mark for subject_name in (English,Mathematics, Tamil,Science) ) t;
Note : PIVOT in SQL Server basically produces a denormalised dataset whereas UNPIVOT produces normalised dataset.
1 comment:
Thanks for posting examples.
A great alternative to UNPIVOT is to use CROSS APPLY. The technique that uses APPLY is more readbale in my opinion, more flexible in that you can unpivot on multiple columns in a straightforward way and CROSS APPLY will generally outperform UNPIVOT, sometimes by many factors.
It is not a as stark a comparison as UNPIVOT vs CROSS APPLY, but using an old-school CrossTab query form is again more readbale (in my opinion) and will generally be equivalent or better on performance than using PIVOT.
In short, I would urge folks to learn the CROSS APPLY method of UNPIVOTing and the Crosstab method of PIVOTing and leave UNPIVOT and PIVOT on the shelf.
Post a Comment