2012-10-12 46 views
1

可能重复的动态数字:
SQL Server dynamic PIVOT query?SQL旋转行列...行

我有一个具有以下结构的数据集。

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) 

我需要产生看起来像这样的输出。

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

基本上它是Measure_ID上的一个支点。不幸的是,可以有无限数量的measure_id。所以枢轴不在了。

我希望避免使用CURSORS,但是如果事实证明这是最好的方法。

+0

对不起,在这里引用我自己的博客,但[这可能有助于](http://www.jadito.us/2012/08/28/rows- /),使用动态-T-SQL到列报头。此外,看起来你正在寻找从行到列。 – Kermit

+0

@Pondlife。你是对的。这与那些密切重复。谢谢你的提示。 –

回答

4

如果你有一个未知的数值,那么你可以使用一个PIVOT使用动态SQL:

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) 

SQL Fiddle With Demo

如果你有一个已知数量的值,那么你可以硬码的值,与此类似:

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 

SQL Fiddle With Demo参见

两个查询会产生相同的结果:

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

令人惊叹的bluefeet。我发誓,有了stackoverflow几乎使它,所以我不必认为:-)我认为这将工作。 –