2012-08-07 42 views
0

我有一个SQL查询“从表名SELECT *”我想修改上面的输出,以低于如下在SQL Server中colums移调行2005

A  B  C 
1  2  3 
其输出

col1 col2  
    A  1 
    B  2 
    C  3 

请让我知道我怎么做到这一点

+0

[Get ROWS as COLUMNS(SQL Server dynamic PIVOT query)](http://stackoverflow.com/questions/12074939/get-rows-as-columns-sql-server-dynamic-pivot-query) – RichardTheKiwi 2013-05-03 11:12:44

回答

9

您将需要执行PIVOT。有两种方法可以使用PIVOT来做到这一点,无论是对要转换的列进行编码的Static Pivot,还是确定执行时的列的Dynamic Pivot。

静态数据透视:

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

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) 

SQL Fiddle with Demo

如果你不想使用PIVOT功能,那么你就可以执行一个类似的类型o ˚F查询与报表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 

SQL Fiddle with Demo

+0

感谢上述解决方案,但动态枢轴列的顺序改变,即列名以desc顺序进来,因为我不想改变列的顺序...有什么办法可以保持顺序列(因为它是...),因此此代码从t1 FOR XML PATH('',TYPE)选择@cols = STUFF((SELECT distinct','+ QUOTENAME(col1).value('。','NVARCHAR(MAX) '),1,1,'')更改列顺序 – user1418827 2012-08-07 15:43:11

+0

@ user1418827而不是在该查询中使用“DISTINCT”,您可以使用“GROUP BY col1 ORDER BY col1”,并且应该按顺序获取它们。 – Taryn 2012-08-07 15:54:26