SQL获得所有可能的数字组合

问题描述 投票:-3回答:3

我有一张这样的桌子

 | 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  |
sql flags pow
3个回答
1
投票

一个有趣的请求,这是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

0
投票

返回列的数量是动态的吗?如果是,那么我认为不能通过SQL函数完成。

如果你只是寻找最后一列 - “总和”,你可以使用下面的代码。

SELECT power(2,RowID)-1

RowID是顺序行号。


-1
投票

这是我如何处理这个问题。我最初认为你可以使用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;
© www.soinside.com 2019 - 2024. All rights reserved.