2010-08-12 14 views
2

您好我想全表旋轉:調換表

LANGUAGE litAccept litDelete litErrorMsg .............. 
------------------------------------------------- 
SPANISH Accept Delete Error has ocurred 
ENGLISH Aceptar Borrar Ha ocurrido un error 
..... 

弄成這個樣子:

LANGUAGE  ENGLISH SPANISH 
--------------------------------------- 
litAccept Accept Aceptar  
litDelete Aceptar Borrar  
litErrorMsg Error.. Ha ocurridO.. 
... 

我PIVOT看你可以旋轉表,但我不知道誰在做這個!

請幫幫忙,謝謝

+0

你看着的SQL Server聯機叢書? – 2010-08-12 10:10:47

+0

數據透視不直接執行此操作。也許你可以先使用'unpivot',然後嘗試使用'pivot'以任何格式重新使用它。我對「SPANISH」行中的「接受」和「刪除」數據感到有點困惑,因爲這開始時似乎是錯誤的。然後在轉換後的版本中,「Delete」已經完全消失。 – 2010-08-12 10:35:44

+0

是的,這是一個錯誤!用'刪除'替換第二行中的'Aceptar' – Diego 2010-08-12 11:23:10

回答

1

哇,我都做到了!

現在我明白它是如何工作的PIVOT。我試圖用動態SQL一次性旋轉整個表格,並且沒有辦法使它適用於pivot的語法。旋轉必須逐列(PIVOT)或逐行(UNPIVOT)在時間表中插入它們以獲得完整的轉置。

我認爲這是我的方式..但也許它可以在單個查詢? (聯盟所有無效,你知道; P)

第二天我會寫我找到的解決方案。

謝謝!

+0

您應該能夠在單個查詢中使用pivot和unpivot,而不是創建臨時表,並將unpivot的輸出成爲主鍵的輸入。 – 2010-08-13 12:48:56

+0

如果行數和列數是動態的,你怎麼能這樣做? – Diego 2010-08-16 06:13:48

0

這可以使用動態SQL與UNPIVOT然後PIVOT完成。

DECLARE @colsUnPivot AS NVARCHAR(MAX), 
    @colsPivot AS NVARCHAR(MAX), 
    @query AS NVARCHAR(MAX) 

SET @colsUnPivot = stuff((select ','+quotename(C.name) 
     from sys.columns as C 
     where C.object_id = object_id('t') and 
       C.name like 'lit%' 
     for xml path('')), 1, 1, '') 

SET @colsPivot = STUFF((SELECT distinct ',' + QUOTENAME(c.Language) 
      FROM t c 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 

set @query = 
      'SELECT * from 
      (
       select Language l1, type language, value 
       from t 
       unpivot 
       (
        value 
        for type in (' + @colsUnPivot + ') 
       ) upvt 
      ) x 
      pivot 
      (
       min(value) 
       for l1 in (' + @colsPivot + ') 
      ) p ' 


execute(@query) 

SQL Fiddle with a Demo