2017-08-03 49 views
1

我從Web服務加載了SQL Server表。這張桌子的結構不是我想要的。T-SQL如何通過row_number將列轉置爲行SQL Server

我的表看起來像這樣:

RN  Text 
1  ID1 
2  Title1 
3  Item1 
4  ID2 
5  Title2 
6  Item2 
7  ID3 
8  Title3 
... ... 

結果表應該是這樣的:

ID  Title Item 
ID1 Title1 Item1 
ID2 Title2 Item2 
ID3 Title3 Item3 
... ...  ... 

我有成千上萬個數據中的一列,每個項目數據包含3行中。我怎樣才能轉置(旋轉)到一個單一的行?

我非常感謝您的幫助!

回答

2

這裏有一個竅門做

;WITH cte 
    AS (SELECT *, 
       seq = (Row_number()OVER(ORDER BY [RN]) - 1)/3 + 1      
     FROM Yourtable) 
SELECT ID = Max(CASE ([RN] - 1) % 3 + 1 WHEN 1 THEN [Text] END), 
     Title = Max(CASE ([RN] - 1) % 3 + 1 WHEN 2 THEN [Text] END), 
     Item = Max(CASE ([RN] - 1) % 3 + 1 WHEN 3 THEN [Text] END) 
FROM cte 
GROUP BY seq 

注:這是假定RN是連續的,如果沒有那麼

;WITH cte 
    AS (SELECT *, 
       seq = (Row_number()OVER(ORDER BY [RN]) - 1)/3 + 1, 
       grp = (Row_number()OVER(ORDER BY [RN]) - 1) % 3 + 1      
     FROM Yourtable) 
SELECT ID = Max(CASE grp WHEN 1 THEN [Text] END), 
     Title = Max(CASE grp WHEN 2 THEN [Text] END), 
     Item = Max(CASE grp WHEN 3 THEN [Text] END) 
FROM cte 
GROUP BY seq 
+1

可恥的簡單化我的回答(刪除)+1額外的步驟確保正確的順序 –

+0

非常感謝您的幫助!它真的解決了我的問題。出於好奇,爲什麼在CASE前添加MAX?那個有什麼用途? – Ronghao