Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

SQL Server pivots? some way to set column names to values within a row

I am building a system of multiple trackers that are going to use a lot of the same columns so there is a table for the trackers, the tracker columns, then a cross reference for which columns go with which tracker, when a user inserts a tracker row the different column values are stored in multiple rows that share the same record id and store both the value and the name of the particular column.

I need to find a way to dynamically change the column name of the value to be the column name that is stored in the same row.

i.e.

id | value | name
------------------
23 | red   | color
23 | fast  | speed

needs to look like this.

id | color | speed
------------------
23 | red   | fast

Any help is greatly appreciated, thank you.

like image 841
ccsimpson3 Avatar asked Dec 26 '22 22:12

ccsimpson3


1 Answers

You can perform this type of query with a PIVOT. There are two ways, a static pivot where you hard-code the values of the columns or a dynamic pivot where the columns are determined at run-time.

Static Pivot (See SQL Fiddle with Demo)

select *
from 
(
  select id, value, name
  from test
) x
pivot
(
  min(value)
  for name in ([color], [speed])
) p

Dynamic Pivot (See SQL Fiddle with Demo)

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

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(name) 
                    from test
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')


set @query 
      = 'SELECT id,' + @cols + ' from 
         (
            SELECT id, value, name
            FROM test
         ) x
         pivot 
         (
            min(value)
            for name in (' + @cols + ')
         ) p '

execute(@query)

Both queries will produce the same results. The difference is that in the first you have to code all of the values that you want to become columns.

like image 68
Taryn Avatar answered Jan 14 '23 06:01

Taryn