2017-10-15 1 views
1

J'ai une table de PostalCode, maintenant je veux déplacer toutes les données en ligne unique comme donner deuxième tablecomment convertir les données à plusieurs colonnes en ligne unique dans SQL

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

Deuxième table

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

'select RowNo, PostalId de (sélectionnez 1 RowNo , PostalId comme Valeur de PostalCode union tous select 2, Pays de PostalCode union tous select 3, StateId à partir de PostalCode union all select 4, DistrictId de PostalCode); ' – L30n1d45

Répondre

2

Vous pouvez le faire avec

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

Vous pouvez l'utiliser.

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

Cela renvoie les résultats avec' RowNo' affecté dans l'ordre alphabétique ('Pays, DistrictId, PostalId, StateId') - pas le ordre indiqué ('PostalId, Country, StateId, DistrictId') –

1

S'il vous plaît essayer autre façon d'obtenir le résultat ci-dessus à l'aide CROSS APPLY avec XML Méthode:

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); 

Résultat:

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