我有一个SQL查询“从表名SELECT *”我想修改上面的输出,以低于如下在SQL Server中colums移调行2005
A B C
1 2 3
其输出
col1 col2
A 1
B 2
C 3
请让我知道我怎么做到这一点
我有一个SQL查询“从表名SELECT *”我想修改上面的输出,以低于如下在SQL Server中colums移调行2005
A B C
1 2 3
其输出
col1 col2
A 1
B 2
C 3
请让我知道我怎么做到这一点
您将需要执行PIVOT
。有两种方法可以使用PIVOT来做到这一点,无论是对要转换的列进行编码的Static Pivot,还是确定执行时的列的Dynamic Pivot。
静态数据透视:
SELECT *
FROM
(
SELECT col1, col2
FROM yourTable
) x
PIVOT
(
min(col2)
for col1 in ([A], [B], [C])
)p
动态透视:
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)
如果你不想使用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
感谢上述解决方案,但动态枢轴列的顺序改变,即列名以desc顺序进来,因为我不想改变列的顺序...有什么办法可以保持顺序列(因为它是...),因此此代码从t1 FOR XML PATH('',TYPE)选择@cols = STUFF((SELECT distinct','+ QUOTENAME(col1).value('。','NVARCHAR(MAX) '),1,1,'')更改列顺序 – user1418827 2012-08-07 15:43:11
@ user1418827而不是在该查询中使用“DISTINCT”,您可以使用“GROUP BY col1 ORDER BY col1”,并且应该按顺序获取它们。 – Taryn 2012-08-07 15:54:26
你想在sql.Here使用PIVOT
或COALESCE
是一个很好的例子,说明如何行转换为列。 Five methods converting rows to columns
。
[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