你可以使用UNPIVOT然后Dynamic PIVOT
DEMO
设置:
create table temp (
col1 integer, col2 integer, col3 integer
)
insert into temp values (1, 1, 1000);
insert into temp values (1, 2, 500);
insert into temp values (2, 3, 800);
insert into temp values (2, 4, 700);
insert into temp values (3, 1, 1100);
UNPIVOT查询:您需要一个row_number
来创建一个虚假的列名称。但随后覆盖行1
给大家,让所有列出现在单行
WITH cte as (
SELECT row_number() over (order by col1, col2) as rn,
col1, col2, col3
FROM temp
)
SELECT 1 as rn,
'c_' +
CAST(rn AS VARCHAR(16)) + '_' +
myCol as myCol,
myVal
INTO temp2
FROM
(SELECT rn, col1, col2, col3
FROM cte) p
UNPIVOT
(myVal FOR myCol IN
(col1, col2, col3)
)AS unpvt;
SELECT * FROM temp2;
动态透视:
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX);
SET @cols = STUFF((SELECT distinct ',' + QUOTENAME(c.myCol)
FROM temp2 c
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = 'SELECT rn, ' + @cols + ' from
(
select rn
, myCol
, myVal
from temp2
) x
pivot
(
max(myVal)
for myCol in (' + @cols + ')
) p ';
EXEC sp_executesql @query
输出:逆透视和动态透视结果
对不起,这太混乱了,你可以给我看一下wh在你想要的结果? '如果有多个数据,那么我需要像下面这样做,直到15次< - 这是什么意思?,为什么15次? – Lamak
如果你想要新的列,我相信你将不得不选择它们。 –
@Lamak我已经更新了期望的问题,谢谢 – Akka