This article provides introduction to the PIVOT and UNPIVOT relational operators introduced in Sql Server 2005 with extensive list of examples.
ALSO READ: Dynamic PIVOT in Sql Server
PIVOT
PIVOT is one of the New relational operator introduced in Sql Server 2005. It provides an easy mechanism in Sql Server to transform rows into columns.
To understand PIVOT with extensive list of examples, let us first create a Temporary Table #CourseSales with sample records as depicted in the below image by using the following script:
--Create Temporary Table #CourseSales CREATE TABLE #CourseSales (Course VARCHAR(50),Year INT,Earning MONEY) GO --Populate Sample records INSERT INTO #CourseSales VALUES('.NET',2012,10000) INSERT INTO #CourseSales VALUES('Java',2012,20000) INSERT INTO #CourseSales VALUES('.NET',2012,5000) INSERT INTO #CourseSales VALUES('.NET',2013,48000) INSERT INTO #CourseSales VALUES('Java',2013,30000) GO
Example 1:
In this example the #CourseSales Table data is Pivoted so that the Course becomes the column headings.
Below script pivots the #CourseSales Table data so that the Course columns distinct values are transformed as Columns in the result set as depicted in the above image.
SELECT * FROM #CourseSales PIVOT(SUM(Earning) FOR Course IN ([.NET], Java)) AS PVTTable
Example 2:
In this example the #CourseSales Table data is Pivoted so that the Year becomes the column headings.
Below script pivots the #CourseSales Table data so that the Year columns distinct values are transformed as Columns in the result set as depicted in the above image.
SELECT * FROM #CourseSales PIVOT(SUM(Earning) FOR Year IN ([2012],[2013])) AS PVTTable
Example 3:
Transforming Sales Table data to a Quarterly aggregated sales data with Quarters as the Columns in the result set.
Let us create a Temporary Sales table and insert 1000 Sample Sales Records With Random past 0-1000 days as the sales date by using the below script.
--Create Temporary Sales Table CREATE TABLE #Sales (SalesId INT IDENTITY(1,1), SalesDate DateTime) GO --Populate 1000 Sample Sales Records With --Random past 0-1000 days as sales date INSERT INTO #Sales(SalesDate) VALUES(DATEADD(dd, - CONVERT(INT, (1000+1)*RAND()),GETDATE())) GO 1000
Now we can write a query like below which Pivots the Sales Table Data such that the quarters are the columns in the final result set as depicted in the above image.
SELECT Year, QPivot.[1] As Q1, QPivot.[2] As Q2, QPivot.[3] As Q3, QPivot.[4] As Q4 FROM (SELECT YEAR(SalesDate) [Year], DATEPART(QUARTER, SalesDate) [Quarter], COUNT(1) [Sales Count] FROM #Sales GROUP BY YEAR(SalesDate), DATEPART(QUARTER,SalesDate)) AS QuarterlyData PIVOT( SUM([Sales Count]) FOR QUARTER IN ([1],[2],[3],[4])) AS QPivot
Example 4:
Transforming Sales Table data to a Monthly aggregated sales data with Months as the Columns in the result set.
We can write a PIVOT query like below to get the Monthly Data as depicted in the above image.
SELECT * FROM (SELECT YEAR(SalesDate) [Year], DATENAME(MONTH, SalesDate) [Month], COUNT(1) [Sales Count] FROM #Sales GROUP BY YEAR(SalesDate), DATENAME(MONTH, SalesDate)) AS MontlySalesData PIVOT( SUM([Sales Count]) FOR Month IN ([January],[February],[March],[April],[May], [June],[July],[August],[September],[October],[November], [December])) AS MNamePivot
[ALSO READ] How to replace NULL value by 0 in the Pivot result
UNPIVOT
UNPIVOT is the reversal of the PIVOT operation. It basically provides a mechanism for transforming columns into rows.
From the above image it is clear that UNPIVOT is the reversal of the PIVOT operation. But it is not the exact reversal of PIVOT operation as PIVOT operation generates the aggregated result, so UNPIVOT will not be able to split the aggregated result back to the original rows as they were present prior to the PIVOT operation.
As depicted in the above image there were 5 rows in the #CourseSales Table Prior to PIVOT, but a PIVOT and it’s reversal UNPIVOT resulted in 4 rows only. The reason for this is for .NET Course in Year 2012 there were two records one with earning 10K and another with earning 5K, the PIVOT and it’s reversal UNPIVOT result last lost this split information and instead of two rows it has generated one row for the .NET course in Year 2012 with Earning as sum of 10K and 5K i.e. 15K.
We can use the below script to simulate the PIVOT and UNPIVOT operation as depicted in the above image on the #CourseSales Temporary Table created in the beginning PIVOT section of this article.
--PIVOT the #CourseSales table data on the Course column SELECT * INTO #CourseSalesPivotResult FROM #CourseSales PIVOT(SUM(Earning) FOR Course IN ([.NET], Java)) AS PVTTable GO --UNPIVOT the #CourseSalesPivotResult table data --on the Course column SELECT Course, Year, Earning FROM #CourseSalesPivotResult UNPIVOT(Earning FOR Course IN ([.NET], Java)) AS UNPVTTable
Examples of PIVOT and Dynamic PIVOT
Below are the some of the examples of retrieving data in Sql Server using PIVOT and Dynamic PIVOT:
- How to get Hourly data in Sql Server
- How to get Daily data in Sql Server
- How to get Monthly Data in Sql Server
- How to get Quarterly Data in Sql Server
- How to get Yearly data in Sql Server
ALSO READ: Dynamic PIVOT in Sql Server
How do you convert the null value to Zero
Using ISNULL
using ISNULL.
————-
SELECT Year,
ISNULL([January],0) [January],
ISNULL([February],0) [February],
ISNULL([March],0) [March],
ISNULL([April],0) [April],
ISNULL([May],0) [May],
ISNULL([June],0) [June],
ISNULL([July],0) [July],
ISNULL([August],0) [August],
ISNULL([September],0) [September],
ISNULL([October],0) [October],
ISNULL([November],0) [November],
ISNULL([December],0) [December]
FROM
(
SELECT YEAR([SalesDate]) Year,
DATENAME(MONTH, SalesDate) [Month],
COUNT(1) [Sales Count]
FROM Sales
GROUP BY YEAR([SalesDate]), DATENAME(MONTH, SalesDate)
)ST
PIVOT (SUM([Sales Count]) FOR Month
IN ([January],[February],[March],[April],[May],
[June],[July],[August],[September],[October],[November],
[December]))PVT
select Course,Year,ISNULL(Earning,0) from #CourseSales
Using ISNULL you can convert null to zero.
Example- select ISNULL (Column_name or variable, 0) from table_name
select isnull(columnname,0) from TableName
using NVL() and NVL2() we can easily covert null value to 0
How To display all row as a column… using sum give only one row
Como hago si lo que va dentro del IN puede ser variable.
SELECT *
FROM (select [Earning],[Year], [Course] from CourseSales) a
PIVOT(SUM(Earning)
FOR Course IN (select distinct(course) from CourseSales)) AS PVTTable
Lo intenté así pero no funciona =(
Hi , At first thank you so mush for your article , it’s very helpful .
If as possible , I need your help about this results like this :
how to inject two colomns in One by using pivot
2012 2013
————————————————-
jan dec jan dec
———————————————————
.net x1 x2 x3 x4
———————————————-
java y1 y2 y3 y4
Hi , At first thank you so mush for your article , it’s very helpful .
If as possible , I need your help about this results like this :
how to inject two colomns in One by using pivot
2012 2013
jan dec jan dec
.net x1 x2 x3 x4
java y1 y2 y3 y4
hi . thanks a lot for you article . great !
Excellent..!!
Great job..!!
hi
I tried another way to write the query using pivot. here i get 0 instead of NULL…I’m not using ISNULL function either. could you explain why? Below is my query
;with QuartelyData as
(select year(salesdate) SYEAR
,month(salesdate) SMONTH,
DATEPART(Quarter,salesdate) Quartely
from Sales
)
select SYEAR,pvtTable.[1] as Q1,pvtTable.[2] as Q2,pvtTable.[3] as Q3,pvtTable.[4] as Q4 from QuartelyData
pivot ( count(Smonth)
for Quartely in ([1],[2],[3],[4])) as pvtTable
order by SYEAR
how to count sum for rows and columns under Example 4.
Appreciate you helps..thanks
SELECT ISNULL(COLUMNNAME,0) FROM TABLENAME
Its very usefull for freshers ……nice example …………….
thanks …..
Thank you Prakash
How does pivot work in the following scenario. I don’t need to sum anything (Or may be Sum over PriceSource?!)
I have a table such as this one
SecurityID Price PriceSource
XYZ 99.00 A
XYZ 97.00 B
XYZ 98.00 C
I need to show this as
SecurityID Price1 Price2 Price3 Price1SRC Price2SRC Price3SRC
XYZ 99.00 97.00 98.00 A B C
Hi, I was wondering how to perform pivot and unpivot together. Say, I wanted to pivot the data on one column and unpivot based on another