Back

Explore Courses Blog Tutorials Interview Questions
0 votes
2 views
in SQL by (20.3k points)

I've been tasked with coming up with a means of translating the following data:

date        category        amount

1/1/2012    ABC             1000.00

2/1/2012    DEF             500.00

2/1/2012    GHI             800.00

2/10/2012   DEF             700.00

3/1/2012    ABC             1100.00

into the following:

date        ABC             DEF             GHI

1/1/2012    1000.00

2/1/2012                    500.00

2/1/2012                                    800.00

2/10/2012                   700.00

3/1/2012    1100.00

The blank spots can be NULLs or blanks, either is fine, and the categories would need to be dynamic. Another possible caveat to this is that we'll be running the query in a limited capacity, which means temp tables are out. I've tried to research and have landed on PIVOT but as I've never used that before I really don't understand it, despite my best efforts to figure it out. Can anyone point me in the right direction?

1 Answer

0 votes
by (40.7k points)

For Dynamic SQL PIVOT you can use below code:

create table temp

(

    date datetime,

    category varchar(3),

    amount money

)

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 date, ' + @cols + ' from 

            (

                select date

                    , amount

                    , category

                from temp

           ) x

            pivot 

            (

                 max(amount)

                for category in (' + @cols + ')

            ) p '

execute(@query)

drop table temp

Output:

Date                                       ABC         DEF    GHI

2012-01-01 00:00:00.000     1000.00     NULL    NULL

2012-02-01 00:00:00.000     NULL        500.00  800.00

2012-02-10 00:00:00.000     NULL        700.00  NULL

2012-03-01 00:00:00.000     1100.00     NULL    NULL

Browse Categories

...