2012-06-27 50 views
3

想象我有這個表:如何創建一個支點查詢

Column A | Column B | Column C 
------------------------------ 
    111   X  10 
    111   Y  12 

我如何可以查詢該表顯示的結果像這樣:

Column A |  X  |  Y 
----------------------------------- 
    111   10   12 
+1

看完「pivot」操作符的許多在線示例之後,究竟有什麼不明確之處?你已經嘗試了什麼? – fvu

+1

請注意,儘管SQL服務器內部的旋轉功能是有用的,並且可以在某些情況下提供幫助,但如果超過10個樞軸(列),則性能會像石頭一樣下降。 – NotMe

+0

@ChrisLively - 非常感謝這個有用的信息! – Coffee

回答

7

您可以通過PIVOT執行此操作。在那裏,你知道你要旋轉的列數,你可以使用一個靜態PIVOT也可以使用動態PIVOT

靜態樞軸(見SQL Fiddle with Demo

SELECT * 
FROM 
(
    select * 
    from t1 
) x 
pivot 
(
    min(columnc) 
    for columnb in ([X], [Y]) 
) p 

動態透視(見SQL Fiddle with Demo

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

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

set @query = 'SELECT columna, ' + @cols + ' from 
      (
       select * 
       from t1 
      ) x 
      pivot 
      (
       min(ColumnC) 
       for ColumnB in (' + @cols + ') 
      ) p ' 

execute(@query) 

兩個版本都會給出相同的結果。第二種方法適用於未知數量的將要轉換的列。

3

嘗試:

DECLARE @tbl TABLE (ColumnA INT, ColumnB CHAR(1), ColumnC INT) 
INSERT @tbl VALUES (111, 'X', 10), (111, 'Y', 12) 

SELECT * 
FROM @tbl 
PIVOT 
(
    MAX(ColumnC) FOR ColumnB IN ([X], [Y]) 
) pvt