Developers often need to transform table data, convering rows to column or column to rows. We can do that using the SQL Pivoting feature. I am not here to tell you how to use pivot, you can learn about that from the following link:

Pivot Examples in SQL Server

Assume you have data in your table as below.

Table Data

And you want the data to be in the following format, as a summarized report:

Report Format Data

The SQL Script for creating the table and inserting the data above will be displayed as in Figure-1.

USE [tempdb]

Go

CREATE TABLE [dbo].[tblTransaction](

[TranDate] [date] NULL,

[TranAmount] [decimal](18, 2) NULL

) ON [PRIMARY]

GO

INSERT [dbo].[tblTransaction] ([TranDate], [TranAmount])

VALUES ('2013-01-01', CAST(200.00 AS Decimal(18, 2)))

, ('2013-02-01', CAST(235.00 AS Decimal(18, 2)))

, ('2013-02-01', CAST(200.00 AS Decimal(18, 2)))

, ('2013-3-01', CAST(135.00 AS Decimal(18, 2)))

, ('2014-01-01', CAST(200.00 AS Decimal(18, 2)))

, ('2014-02-01', CAST(225.00 AS Decimal(18, 2)))

, ('2014-02-01', CAST(200.00 AS Decimal(18, 2)))

, ('2013-4-01', CAST(200.00 AS Decimal(18, 2)))

, ('2013-5-01', CAST(160.00 AS Decimal(18, 2)))

, ('2013-6-01', CAST(200.00 AS Decimal(18, 2)))

, ('2013-7-01', CAST(260.00 AS Decimal(18, 2)))

, ('2014-3-01', CAST(200.00 AS Decimal(18, 2)))

, ('2014-4-01', CAST(40.00 AS Decimal(18, 2)))

, ('2013-7-01', CAST(200.00 AS Decimal(18, 2)))

, ('2013-8-01', CAST(480.00 AS Decimal(18, 2)))

, ('2014-5-01', CAST(90.00 AS Decimal(18, 2)))

, ('2014-6-01', CAST(200.00 AS Decimal(18, 2)))

, ('2014-7-01', CAST(35.00 AS Decimal(18, 2)))

, ('2013-9-01', CAST(200.00 AS Decimal(18, 2)))

, ('2013-10-01', CAST(320.00 AS Decimal(18, 2)))

, ('2013-11-01', CAST(140.00 AS Decimal(18, 2)))

, ('2013-11-01', CAST(220.00 AS Decimal(18, 2)))

, ('2014-7-01', CAST(200.00 AS Decimal(18, 2)))

, ('2014-8-01', CAST(65.00 AS Decimal(18, 2)))

, ('2014-9-01', CAST(95.00 AS Decimal(18, 2)))

, ('2014-10-01', CAST(200.00 AS Decimal(18, 2)))

, ('2013-11-01', CAST(350.00 AS Decimal(18, 2)))

, ('2013-12-01', CAST(200.00 AS Decimal(18, 2)))

, ('2013-12-01', CAST(550.00 AS Decimal(18, 2)))

, ('2014-11-01', CAST(385.00 AS Decimal(18, 2)))

, ('2014-11-01', CAST(200.00 AS Decimal(18, 2)))

, ('2014-11-01', CAST(45.00 AS Decimal(18, 2)))

, ('2014-12-01', CAST(75.00 AS Decimal(18, 2)))

, ('2014-12-01', CAST(265.00 AS Decimal(18, 2)))

Go

SELECT year(TranDate) as Year, left(datename(month,TranDate),3) as Month, TranAmount as Amount FROM tblTransaction


The data should be displayed as in the following format:

Display data

You need to write a SQL Script using Pivot but you can generate a SQL Script by executing the following Script for the "tblTransaction" table created above.

USE [tempdb]

GO

DECLARE @columns NVARCHAR(MAX), @sql NVARCHAR(MAX);

SET @columns = N'';

SELECT @columns += N', p.' + QUOTENAME(month)

FROM (SELECT distinct month(TranDate) as m, left(datename(month,TranDate),3)as [month] FROM dbo.tblTransaction AS p

) AS x;

SET @sql = N' SELECT * FROM

(

SELECT

year(TranDate) as [year],left(datename(month,TranDate),3)as [month],

TranAmount as Amount

FROM tblTransaction

) AS j

PIVOT

(

SUM(Amount) FOR [month] IN ('

+ STUFF(REPLACE(@columns, ', p.[', ',['), 1, 1, '')

+ ')

) AS p;';

Print @sql;

When the preceding script is executed you should get the Pivot SQL Script in your SQL Server Management Studio Editor as shown below. Copy and paste then execute the generated script.

Pivot Sql Script

Now enjoy what you have the very easy way!!!! :)

A point of interest: you can modify the script depending on your database records.

Finally

USE [tempdb]

GO

Drop Table tblTransaction