Sql server 在sql server中将两列转换为5行

Sql server 在sql server中将两列转换为5行,sql-server,Sql Server,我有一个包含数据的临时表 select * from #test 此输出的过程: reg | Years --------------- 6279 | 2016 6641 | 2016 8347 | 2016 6228 | 2015 8596 | 2015 7596 | 2015 6352 | 2015 1245 | 2014 5248 | 2014 6359 | 2014 6785 | 2014 9578 | 2013 4398 | 2013 2986 | 2013 7296 | 201

我有一个包含数据的临时表

select * 
from #test
此输出的过程:

reg  | Years
---------------
6279 | 2016
6641 | 2016
8347 | 2016
6228 | 2015
8596 | 2015
7596 | 2015
6352 | 2015
1245 | 2014
5248 | 2014
6359 | 2014
6785 | 2014
9578 | 2013
4398 | 2013
2986 | 2013
7296 | 2013
但是上面的表我需要显示在5行中。它意味着将列转换为行,例如下面的示例

years | reg1 | reg2 | reg3 | reg4
------+------+------+------+-----
 2016 | 6279 | 6641 | 8347 | NULL
 2015 | 6228 | 8596 | 7596 | 6352
 2014 | 1245 | 5248 | 6359 | 6785
 2013 | 9578 | 4398 | 2986 | 7296

根据一些建议,我已经尝试过使用pivot和unpivot,但仍然没有成功。请帮助我。

对于每年数量有限的记录,您可以在静态SQL查询中使用条件聚合:

;WITH temp_with_rn AS (
  SELECT eg, years, ROW_NUMBER() OVER (PARTITION BY Years ORDER BY eg) AS rn
  FROM temp
) 
SELECT years, 
       MAX(CASE WHEN rn = 1 THEN eg END) AS reg1,
       MAX(CASE WHEN rn = 2 THEN eg END) AS reg2,
       MAX(CASE WHEN rn = 3 THEN eg END) AS reg3,
       MAX(CASE WHEN rn = 4 THEN eg END) AS reg4
FROM temp_with_rn
GROUP BY years

下面是一个使用交叉表技巧动态实现的

使用枢轴:

Select * from
(Select *, 'reg' + cast(row_number() over(partition by year order by reg) as varchar(5)) RowVal
from table) x
PIVOT
(
MAX(reg) FOR RowVal in ([reg1], [reg2], [reg3], [reg4])
) y
order by year desc

我有一个疑问。。。我们正在查询中使用Max函数。。。。如果我们使用最大值,它将首先出现。。。。但是我不需要。。请帮帮我。。。在其他解决方案中
Select * from
(Select *, 'reg' + cast(row_number() over(partition by year order by reg) as varchar(5)) RowVal
from table) x
PIVOT
(
MAX(reg) FOR RowVal in ([reg1], [reg2], [reg3], [reg4])
) y
order by year desc