将行转置为SQL Server 2005中的列

use*_*827 0 sql t-sql sql-server pivot sql-server-2005

我有一个SQL查询"Select*from tablename",其输出为

col1   col2       
  A     1 
  B     2 
  C     3
Run Code Online (Sandbox Code Playgroud)

我想将上面的输出修改为如下所示

A      B      C
1      2      3 
Run Code Online (Sandbox Code Playgroud)

请让我知道如何实现这一目标

Tar*_*ryn 9

你需要执行一个PIVOT.有两种方法可以使用PIVOT执行此操作,可以使用静态数据透视表来编码要转换的列,也可以使用动态数据透视表来确定执行时的列.

静态枢轴:

SELECT *
FROM
(
    SELECT col1, col2
    FROM yourTable
) x
PIVOT
(
   min(col2)
   for col1 in ([A], [B], [C])
)p
Run Code Online (Sandbox Code Playgroud)

请参阅SQL Fiddle with Demo

动态枢轴:

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

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(col1) 
                    from t1
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'SELECT ' + @cols + ' from 
             (
                select col1, col2
                from t1
            ) x
            pivot 
            (
                min(col2)
                for col1 in (' + @cols + ')
            ) p '

execute(@query)
Run Code Online (Sandbox Code Playgroud)

请参阅SQL Fiddle with Demo

如果您不想使用该PIVOT函数,则可以使用CASE语句执行类似类型的查询:

select 
  SUM(CASE WHEN col1 = 'A' THEN col2 END) as A,
  SUM(CASE WHEN col1 = 'B' THEN col2 END) as B,
  SUM(CASE WHEN col1 = 'C' THEN col2 END) as C
FROM t1
Run Code Online (Sandbox Code Playgroud)

请参阅SQL Fiddle with Demo