如何在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来实现并扭转困境
答案 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 APPLY
与VALUES()
结合使用来创建派生的结果集
-您需要事先知道列名,并且必须将其强制转换为通用类型
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>