sql >> Database >  >> RDS >> Sqlserver

Pivot zonder aggregatiefunctie in MSSQL 2008 R2

U kunt de PIVOT-functie gebruiken om het resultaat te krijgen, u hoeft alleen row_number() te gebruiken helpen.

De basisquery hiervoor is:

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

Zie SQL Fiddle met demo . Ik gebruik row_number() om een ​​afzonderlijke waarde toe te passen op elke rij binnen de skill en skill_id , dan gebruikt u deze rijnummerwaarde als de kolom om te PIVOT.

De volledige code met de toegepaste PIVOT zal zijn:

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;

Zie SQL Fiddle met demo .

In jouw geval lijkt het alsof je een onbekend aantal parameters hebt voor elke vaardigheid. Als dat waar is, dan wil je dynamische SQL gebruiken om het resultaat te krijgen:

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);

Zie SQL Fiddle met demo




  1. LOAD DATA is niet toegestaan ​​in opgeslagen procedures

  2. MySQL-functie om het aantal werkdagen tussen twee datums te vinden

  3. Hoe negeer ik ampersands in een SQL-script dat wordt uitgevoerd vanuit SQL Plus?

  4. Wat zijn verschillende soorten beperkingen die beschikbaar zijn in SQL Server - SQL Server / T-SQL-zelfstudie, deel 50