2012-08-07 70 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