我有一個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