2017-10-15 66 views
1

POSTALCODE的表,現在我想將所有的數據單列像給第二臺我如何多列數據轉換成一行在SQL

PostalId Country StateId DistrictId 
-------- ------- ------- ---------- 
    110051   1  110   10165 

二表

RowNo Value 
----- ----- 
1  110051 
2  1 
3  110 
4  10165 
+0

'從 選擇RowNo,PostalId(選擇1爲RowNo ,PostalId作爲來自PostalCode的值 union all select 2,Country from PostalCode union all select 3,StateId from PostalCode union all select 4,DistrictId from PostalCode);' – L30n1d45

回答

2

你可以做到這一點

SELECT V.RowNo, 
     V.Value 
FROM PostalCode 
     CROSS APPLY (VALUES (1, PostalId), 
          (2, Country), 
          (3, StateId), 
          (4, DistrictId))V(RowNo, Value); 
0

你可以使用這個。

SELECT ROW_NUMBER() OVER(ORDER BY RowNo) RowNo, Value 
    FROM PostalCode UNPIVOT(Value FOR 
         RowNo IN ([PostalId], [Country], [StateId], [DistrictId])) UNPVT 
+1

這將返回帶有'RowNo'字母順序('Country,DistrictId,PostalId,StateId')的結果 - 而不是命令說明('PostalId,Country,StateId,DistrictId') –

1

請嘗試另一種方式使用CROSS APPLYXML方法來達到以上的結果:

SELECT ROW_NUMBER() OVER(ORDER BY 
         (
          SELECT NULL 
         )) RowNo, 
     split.a.value('.', 'VARCHAR(MAX)') Value 
FROM 
(
    SELECT CAST('<X>'+REPLACE(CONVERT(VARCHAR(MAX), PostalId)+','+CONVERT(VARCHAR(MAX), Country)+','+CONVERT(VARCHAR(MAX), StateId)+','+CONVERT(VARCHAR(MAX), DistrictId), ',', '</X><X>')+'</X>' AS XML) AS String 
    FROM PostalCode 
) AS Z 
CROSS APPLY String.nodes('/X') AS split(a); 

結果:

RowNo Value 
----- ----- 
1  110051 
2  1 
3  110 
4  10165