我有一个包含 2 列的表格 -identifier
(1, 2, 3...( 和值。
有必要制作一个表,其中列将是标识符除以 3 的残余。
举个例子:
表1:
id value
----------
1 aaa
2 bbb
3 ccc
4 ddd
5 eee
6 fff
结果应为:
0 1 2
----------------
aaa bbb ccc
ddd eee fff
请告诉我如何在SQL Server中执行此操作。
是否可以实现它不使用标识符作为单独的列,而仅使用实际的行号
您可以执行条件聚合。如果id
从1
开始并且始终递增,没有间隙,则:
select
max(case when (id - 1) % 3 = 0 then value end) value1,
max(case when (id - 1) % 3 = 1 then value end) value2,
max(case when (id - 1) % 3 = 2 then value end) value3
from from mytable t
group by (id - 1) / 3
否则我们可以生成一个序列,row_number()
:
select
max(case when rn % 3 = 0 then value end) value1,
max(case when rn % 3 = 1 then value end) value2,
max(case when rn % 3 = 2 then value end) value3
from (
select t.*, row_number() over(order by id) - 1 rn
from mytable t
) t
group by rn / 3
答案较晚,但这里有一个选项,您可以动态定义列数
例
Declare @Col int = 3
Declare @SQL varchar(max) = stuff( ( Select ',' + QuoteName([N])
From ( Select Top (@Col) N=-1+Row_Number() Over (Order By (Select NULL))
From master..spt_values
) n1
For XML Path('')),1,1,'')
Set @SQL = '
Declare @Col int = '+convert(varchar(10),@Col)+';
Select '+@SQL+'
From (
Select Value
,ColNr=(row_number() over (order by id) - 1) % @Col
,RowNr=(row_number() over (order by id) - 1) / @Col
From #YourTable
) src
Pivot ( max(Value) for ColNr in ('+@SQL+' ) ) pvt '
Exec(@SQL)
返回
0 1 2
aaa bbb ccc
ddd eee fff