如何在sql中单行转换多列数据

时间:2017-10-15 18:37:22

标签: sql sql-server tsql

我有一个 PostalCode 的表,现在我想将所有数据移到单行中,比如给第二个表

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

第二张表

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

3 个答案:

答案 0 :(得分:2)

您可以使用

执行此操作
SELECT V.RowNo,
       V.Value
FROM   PostalCode
       CROSS APPLY (VALUES (1, PostalId),
                           (2, Country),
                           (3, StateId),
                           (4, DistrictId) )V(RowNo, Value);

答案 1 :(得分:1)

请使用CROSS APPLY XML方法尝试其他一种方式来实现上述结果:

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

答案 2 :(得分:0)

你可以使用它。

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