如何在SQL Server中将行转换为列?

时间:2019-02-28 15:44:03

标签: sql sql-server pivot-table common-table-expression

如何在SQL Server中将行转换为列。

我有一个表有3列我想转换成单行 示例代码如下

CREATE TABLE #TABLE (
    ID INT PRIMARY KEY ,
    NAME VARCHAR(10),
    ADDRESS VARCHAR(10)
);

INSERT INTO  #TABLE VALUES ('ABC','INDIA')
    SELECT *
    FROM #TABLE

ID | NAME |ADDRESS
1  | ABC  | INDIA

我要这样

ID     |1
NAME   |ABC
ADDRESS|INDIA

我尝试通过使用CTE来实现并扭转困境

1 个答案:

答案 0 :(得分:4)

使用您的值设置模型

DECLARE @tbl TABLE (
    ID INT IDENTITY PRIMARY KEY ,
    [NAME] VARCHAR(10),
    [ADDRESS] VARCHAR(10)
);

INSERT INTO  @tbl VALUES ('ABC','INDIA')
                        ,('one','more')

-这种方法将CROSS APPLYVALUES()结合使用来创建派生的结果集
-您需要事先知道列名,并且必须将其强制转换为通用类型

SELECT A.*
FROM @tbl t
CROSS APPLY (VALUES('ID',CAST(t.ID AS NVARCHAR(100)))
                  ,('NAME',CAST(t.[NAME] AS NVARCHAR(100)))
                  ,('ADDRESS',CAST(t.[ADDRESS] AS NVARCHAR(100)))) A(ColumnName,ColumnValue)

-这种方法是完全通用的,适用于任何集合和类型

SELECT AllCols.value('local-name(.)','nvarchar(max)') AS ColumnName
      ,AllCols.value('text()[1]','nvarchar(max)') AS ColumnValue
FROM
(
    SELECT * FROM @tbl FOR XML PATH('row'),TYPE
) A(AsXml)
CROSS APPLY A.AsXml.nodes('/row/*') B(AllCols)

背后的想法是将select读取为XML并使用XQuery的通用功能:

<row>
  <ID>1</ID>
  <NAME>ABC</NAME>
  <ADDRESS>INDIA</ADDRESS>
</row>
<row>
  <ID>2</ID>
  <NAME>one</NAME>
  <ADDRESS>more</ADDRESS>
</row>