【问题标题】:SQL rotate rows to columns...dynamic number of rows [duplicate]SQL将行旋转到列...动态行数[重复]
【发布时间】:2012-10-03 15:09:18
【问题描述】:

可能重复:
SQL Server dynamic PIVOT query?

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

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。所以 Pivot 出局了。

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

【问题讨论】:

  • 很抱歉在这里引用我自己的博客,但this may help。此外,您似乎希望从行转到列。
  • @Pondlife。你是对的。这与那些非常相似。感谢您的来信。

标签: sql sql-server-2008 tsql pivot


【解决方案1】:

如果您有未知数量的值,那么您可以将 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

【讨论】:

  • 令人惊叹的蓝脚。我发誓,几乎可以使用stackoverflow,所以我不必考虑:-)我认为这会奏效。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-08-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-13
  • 2014-09-08
相关资源
最近更新 更多