Microsoft SQL Server

Dynamic SQL Pivot

Introduction#

This topic covers how to do a dynamic pivot in SQL Server.

Basic Dynamic SQL Pivot

if object_id('tempdb.dbo.#temp') is not null drop table #temp
create table #temp
(
    dateValue datetime,
    category varchar(3),
    amount decimal(36,2)
)

insert into #temp values ('1/1/2012', 'ABC', 1000.00)
insert into #temp values ('2/1/2012', 'DEF', 500.00)
insert into #temp values ('2/1/2012', 'GHI', 800.00)
insert into #temp values ('2/10/2012', 'DEF', 700.00)
insert into #temp values ('3/1/2012', 'ABC', 1100.00)


DECLARE 
    @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX);

SET @cols = STUFF((SELECT distinct ',' + QUOTENAME(c.category) 
            FROM #temp c 
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = '
            SELECT 
                dateValue, 
                ' + @cols + ' 
            from 
            (
                select
                     dateValue,
                     amount,
                     category
                from #temp
           ) x
            pivot 
            (
                 sum(amount)
                for category in (' + @cols + ')
            ) p '


exec sp_executeSql @query

This modified text is an extract of the original Stack Overflow Documentation created by the contributors and released under CC BY-SA 3.0 This website is not affiliated with Stack Overflow