sql >> Databasteknik >  >> RDS >> Sqlserver

Pivot utan aggregatfunktion i MSSQL 2008 R2

Du kan använda PIVOT-funktionen för att få resultatet, du behöver bara använda row_number() att hjälpa.

Grundfrågan för detta kommer att vara:

select skill_id, skill, parameter,
  row_number() over(partition by skill, skill_id order by skill_id) rn
from yt;

Se SQL-fiol med demo . Jag använder row_number() för att tillämpa ett distinkt värde på varje rad inom skill och skill_id , kommer du sedan att använda detta radnummervärde som kolumn för att PIVOT.

Den fullständiga koden med PIVOT tillämpad kommer att vara:

select skill_id, skill,[Parameter_1], [Parameter_2], [Parameter_3]
from 
(
  select skill_id, skill, parameter,
    'Parameter_'+cast(row_number() over(partition by skill, skill_id 
                                     order by skill_id) as varchar(10)) rn
  from yt
) d
pivot
(
  max(parameter)
  for rn in ([Parameter_1], [Parameter_2], [Parameter_3])
) piv;

Se SQL-fiol med demo .

I ditt fall verkar det som att du kommer att ha ett okänt antal parametrar för varje färdighet. Om det är sant, kommer du att vilja använda dynamisk SQL för att få resultatet:

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

select @cols = STUFF((SELECT distinct ',' + QUOTENAME('Parameter_'
                          +cast(row_number() over(partition by skill, skill_id 
                               order by skill_id) as varchar(10))) 
                    from yt
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'SELECT skill_id, skill,' + @cols + ' from 
             (
                select skill_id, skill, parameter,
                  ''Parameter_''+cast(row_number() over(partition by skill, skill_id 
                                   order by skill_id) as varchar(10)) rn
                from yt
            ) x
            pivot 
            (
                max(parameter)
                for rn in (' + @cols + ')
            ) p '

execute(@query);

Se SQL-fiol med demo




  1. LongOpsWatcher i SQL Dev

  2. SQL-uppdatering översta radens fråga

  3. SQL för att returnera en sammanslagen uppsättning resultat

  4. Slå samman två tabeller i en SQL-fråga och gör datumvärdena unika