SQL Server unpivot two columns

為{幸葍}努か 提交于 2019-12-06 03:48:37

I would use APPLY:

select v.*
from tbl1 t cross apply
     (values ('A1', t.A1, t.cA1),
             ('A2', t.A2, t.cA2),
             ('A3', t.A3, t.cA3)
     ) v(A, value1, value2);

CROSS APPLY implements a lateral join. This is much more powerful than merely unpivoting data, although unpivoting data is one simple way to start learning about lateral joins.

Another way with XML:

DECLARE @x xml = (SELECT * FROM tbl1 as t FOR XML AUTO, TYPE)

;WITH cte AS (
SELECT  CAST(t.c.query('local-name(.)') as nvarchar(10)) as [name],
        t.c.value('.','int') as [value],
        p.number as [pos]
FROM [master]..spt_values p
CROSS APPLY @x.nodes('/t[position()=sql:column("number")]/@*') as t(c)
WHERE p.[type] = 'p'
)

SELECT  c.[name] as A,
        c.[value] as value1,
        c1.[value] as value2
FROM cte c
INNER JOIN cte c1
    ON c1.[name] = N'c'+c.[name] and c.pos = c1.pos

Output:

A   value1  value2
A1  60      2
A2  30      3
A3  10      5
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!