2012-10-12 3 views
1

dupliquées possible:
SQL Server dynamic PIVOT query?SQL tourner lignes à colonnes ... nombre dynamique de lignes

J'ai un ensemble de données qui a la structure ci-dessous.

CREATE TABLE #TempTable 
    (
    Measure_ID INT, 
    measurement DECIMAL(18, 4) 
) 

INSERT INTO #TempTable 
VALUES 
(1,2.3) 
,(1,3.4) 
,(1,3.3) 
,(2,3) 
,(2,2.3) 
,(2,4.0) 
,(2,4.5) 

Je dois produire une sortie qui ressemblera à ceci.

1,2.3,3.4,3.3 
2,3,2.3,4.0,4.5 

Fondamentalement, c'est un pivot sur Measure_ID. Malheureusement, il peut y avoir un nombre illimité de measure_id. Donc Pivot est sorti. J'espère éviter les curseurs, mais si cela s'avère être la meilleure approche.

+0

Désolé à référencer mon propre blog, mais [cela peut aider] (http://www.jadito.us/2012/08/28/rows- to-column-header-using-dynamic-t-sql /). En outre, il semble que vous cherchez à aller de lignes en colonnes. – Kermit

+0

@Pondlife. Vous avez raison. C'est un double proche de ceux-ci. Merci pour la note. –

Répondre

4

Si vous avez un nombre inconnu de valeurs, vous pouvez utiliser un PIVOT avec SQL dynamique:

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

select @cols = STUFF((SELECT distinct ',' 
         + QUOTENAME('Measurement_' + cast(rn as varchar(10))) 
        from temptable 
        cross apply 
        (
         select row_number() over(partition by measure_id order by measurement) rn 
         from temptable 
        ) x 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 

set @query = 'SELECT measure_id, ' + @cols + ' from 
      (
       select measure_id, measurement, 
        ''Measurement_'' 
        + cast(row_number() over(partition by measure_id order by measurement) as varchar(10)) val 
       from temptable 
      ) x 
      pivot 
      (
       max(measurement) 
       for val in (' + @cols + ') 
      ) p ' 

execute(@query) 

Voir SQL Fiddle With Demo

Si vous avez un nombre connu de valeurs, alors vous pouvez HARD- le code des valeurs, similaires à ceci:

SELECT measure_id, [Measurement_1], [Measurement_2], 
       [Measurement_3], [Measurement_4] 
from 
(
    select measure_id, measurement, 
    'Measurement_' 
    + cast(row_number() over(partition by measure_id order by measurement) as varchar(10)) val 
    from temptable 
) x 
pivot 
(
    max(measurement) 
    for val in ([Measurement_1], [Measurement_2], 
       [Measurement_3], [Measurement_4]) 
) p 

Voir SQL Fiddle With Demo

Les deux requêtes produiront les mêmes résultats:

MEASURE_ID | MEASUREMENT_1 | MEASUREMENT_2 | MEASUREMENT_3 | MEASUREMENT_4 
========================================================================== 
1   | 2.3   | 3.3   | 3.4   | (null) 
2   | 2.3   | 3    | 4    | 4.5 
+0

Superbes pieds-bleus. Je le jure, avoir stackoverflow autour le fait presque tellement je ne dois pas penser :-) Je pense que cela fonctionnera. –