我有一张这样的桌子
| Number |
----------
| 1 |
| 2 |
| 4 |
| 8 |
| 16 |
| 32 |
可以创建一个将返回该功能的函数
| 1 | 2 | 3 | 4 | 5 | 6 | sum |
--------------------------------
| 1 | | | | | | 1 |
| 1 | 2 | | | | | 3 |
| 1 | 2 | 4 | | | | 7 |
| 1 | 2 | 4 | 8 | | | 15 |
| 1 | 2 | 4 | 8 | 16 | | 31 |
| 1 | 2 | 4 | 8 | 16 | 32 | 63 |
一个有趣的请求,这是MSSQL的解决方案。如果您更清楚地解释主要目的,我们可以提供更好的解决方案。
create table #temp (num int)
insert into #temp (num) values (1),(2),(4),(8),(16),(32)
select num, rn = ROW_NUMBER() OVER (order by num asc)
into #temp2
from #temp
select num,num2=null,num3=null,num4=null,num5=null,num6=null,Total=(select sum(num) from #temp2 where rn in (1)) from #temp2 where rn = 1
union
select null,num,null,null,null,null,Total=(select sum(num) from #temp2 where rn in (1,2)) from #temp2 where rn = 2
union
select null,null,num,null,null,null,Total=(select sum(num) from #temp2 where rn in (1,2,3)) from #temp2 where rn = 3
union
select null,null,null,num,null,null,Total=(select sum(num) from #temp2 where rn in (1,2,3,4)) from #temp2 where rn = 4
union
select null,null,null,null,num,null,Total=(select sum(num) from #temp2 where rn in (1,2,3,4,5)) from #temp2 where rn = 5
union
select null,null,null,null,null,num,Total=(select sum(num) from #temp2 where rn in (1,2,3,4,5,6)) from #temp2 where rn = 6
order by Total asc
返回列的数量是动态的吗?如果是,那么我认为不能通过SQL函数完成。
如果你只是寻找最后一列 - “总和”,你可以使用下面的代码。
SELECT power(2,RowID)-1
RowID是顺序行号。
这是我如何处理这个问题。我最初认为你可以使用apply运算符,但是union方法最容易使用。我的答案与Eray(我非常喜欢这种方法)之间的主要区别在于我正在使用不相关的子查询生成总和值并保持每列的唯一数字。
我认为这可以使用动态SQL实现未知数量的列,但我没有时间或资源来尝试现在就可以解决这个问题。请看下面的代码,我希望它有所帮助。
declare @numbers table
(
numberid int
);
insert into @numbers (numberid)
values
(1),
(2),
(4),
(6),
(8),
(16),
(32);
select numberid as [1], null as [2], null as [3], null as [4], null as [5], null as
[6], (select sum(numberid) from @numbers where numberid=1) as [sum] from @numbers
where numberid =1
union
select (select numberid from @numbers where numberid=1), numberid, null, null, null,
null, (select sum(numberid) from @numbers where numberid in (1, 2)) from @numbers
where numberid =2
union
select (select numberid from @numbers where numberid=1), (select numberid from
@numbers where numberid=2), numberid, null, null, null, (select sum(numberid) from
@numbers where numberid in (1, 2, 4)) from @numbers where numberid =4
union
select (select numberid from @numbers where numberid=1), (select numberid from
@numbers where numberid=2), (select numberid from @numbers where numberid=4),
numberid, null, null, (select sum(numberid) from @numbers where numberid in (1, 2, 4,
8)) from @numbers where numberid =8
union
select (select numberid from @numbers where numberid=1), (select numberid from
@numbers where numberid=2), (select numberid from @numbers where numberid=4), (select
numberid from @numbers where numberid=8), numberid, null, (select sum(numberid) from
@numbers where numberid in (1, 2, 4, 8, 16)) from @numbers where numberid =16
union
select (select numberid from @numbers where numberid=1), (select numberid from
@numbers where numberid=2), (select numberid from @numbers where numberid=4), (select
numberid from @numbers where numberid=8), (select numberid from @numbers where
numberid=16), numberid, (select sum(numberid) from @numbers where numberid in (1, 2,
4, 8, 16, 32)) from @numbers where numberid =32;