SQL Server :创建一个表,其中列是一行 - 索引 mod x



我有一个包含 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中执行此操作。

是否可以实现它不使用标识符作为单独的列,而仅使用实际的行号

您可以执行条件聚合。如果id1开始并且始终递增,没有间隙,则:

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

最新更新