Skip to content Skip to sidebar Skip to footer

Sql Transpose Row Data Into Columns

I'm looking for a pure-SQL way (SQL Server 2012 if it matters) to convert row data to columns. I've tried searching for this, and can't find anything for the data format I'm tryin

Solution 1:

As suggested by Xingzhou Liu, I came up into this.

Source:

            IF ( OBJECT_ID('tempdb..#TMPtbl') ISNOTNULL )
                BEGINDROPTABLE #TMPtbl
                ENDCREATETABLE #TMPtbl
                (
                  Id INTIDENTITY(1, 1)
                         PRIMARY KEY ,
                  [Version] VARCHAR(10) ,
                  [Date] DATETIME ,
                  StoryPoints INT
                )

            INSERTINTO #TMPtbl
                    ( Version, Date, StoryPoints )
            VALUES  ( '1.0', '2017-01-01', 10 ),
                    ( '1.0', '2017-02-01', 10 ),
                    ( '1.0', '2017-03-01', 15 ),
                    ( '1.0', '2017-04-01', 15 ),
                    ( '2.0', '2017-01-01', 10 ),
                    ( '2.0', '2017-02-01', 10 ),
                    ( '2.0', '2017-03-01', 10 ),
                    ( '2.0', '2017-04-01', 10 ),
                    ( '3.0', '2017-01-01', 5 ),
                    ( '3.0', '2017-02-01', 5 ),
                    ( '3.0', '2017-03-01', 5 ),
                    ( '3.0', '2017-04-01', 5 ),
                    ( 'Completed', '2017-01-01', 0 ),
                    ( 'Completed', '2017-02-01', 5 ),
                    ( 'Completed', '2017-03-01', 15 ),
                    ( 'Completed', '2017-04-01', 28 )

Using STUFF and FOR XML you can get the column dynamically

DECLARE@StrColVer NVARCHAR(MAX) = STUFF(( SELECTDISTINCT', '+ QUOTENAME(CAST(t.[Version] ASVARCHAR(154)))
                                                           FROM     #TMPtbl t
                                                         FOR
                                                           XML PATH('')
                                                         ), 1, 2, '')


                DECLARE@StrColSUmVer NVARCHAR(MAX) = STUFF(( SELECTDISTINCT', '+'SUM('+ QUOTENAME(CAST(t.[Version] ASVARCHAR(154)))
                                                                        +') '+ QUOTENAME(CAST(t.[Version] ASVARCHAR(154)))
                                                              FROM      #TMPtbl t
                                                            FOR
                                                              XML PATH('')
                                                            ), 1, 2, '')

                DECLARE@StrColDate NVARCHAR(MAX) = STUFF(( SELECTDISTINCT', '+ QUOTENAME(FORMAT(t.Date,
                                                                              'yyyy-MM-dd'))
                                                            FROM    #TMPtbl t
                                                          FOR
                                                            XML PATH('')
                                                          ), 1, 2, '')

                DECLARE@StrColSumDate NVARCHAR(MAX) = STUFF(( SELECTDISTINCT', '+'SUM('+ QUOTENAME(FORMAT(t.Date,
                                                                              'yyyy-MM-dd'))
                                                                        +') '+ QUOTENAME(FORMAT(t.Date,
                                                                              'yyyy-MM-dd'))
                                                               FROM     #TMPtbl t
                                                             FOR
                                                               XML PATH('')
                                                             ), 1, 2, '')

Then Pivot and Execute it as a command query string.

DECLARE @SQL1 NVARCHAR(MAX)  = N'SELECT [Date],' + @StrColSUmVer + 'FROM (
                SELECT * FROM #TMPtbl

        )P
    PIVOT (
            SUM(StoryPoints) FOR Version IN (' + @StrColVer + ')
    )PVT
    GROUPBY pvt.[Date]'DECLARE @SQL2 NVARCHAR(MAX)  = N'SELECT [Version],' + @StrColSumDate + 'FROM (
                SELECT * FROM #TMPtbl

        )P
    PIVOT (
            SUM(StoryPoints) FORdATEIN (' + @StrColDate + ')
    )PVT
    GROUPBY pvt.[Version]'

EXEC(@SQL1)
EXEC(@SQL2)

Results

Date1.02.03.0Completed-------------------------------------------------------------------2017-01-01 00:00:00.000 1010502017-02-01 00:00:00.000 1010552017-03-01 00:00:00.000 15105152017-04-01 00:00:00.000 1510528(4row(s)affected)Version2017-01-01  2017-02-01  2017-03-01  2017-04-01------------------------------------------------------1.0101015152.0101010103.05555Completed051528(4row(s)affected)

Solution 2:

SQL Server 2012 requires you to hard code one of the dimensions you are pivoting by into the PIVOT query.

One way you could get around it is by building and executing a dynamic query string.

Post a Comment for "Sql Transpose Row Data Into Columns"