SQL получить все возможные комбинации чисел - PullRequest
0 голосов
/ 24 января 2019

у меня есть такая таблица

 | 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  |

Ответы [ 3 ]

0 голосов
/ 24 января 2019

Интересный запрос, вот решение для 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 голосов
/ 24 января 2019

Вот как я бы подошел к проблеме.Я изначально думал, что вы могли бы использовать оператор применения, однако с объединенным подходом работать проще всего.Основное различие между моим ответом и ответом Эрея (спасибо мне очень понравился подход) состоит в том, что я использую некоррелированные подзапросы в строке, чтобы генерировать значения суммы и поддерживать уникальное число, спускаясь по каждому из столбцов.

Я бы сказал, что это МОЖЕТ быть достигнуто с использованием динамического 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;
0 голосов
/ 24 января 2019

Является ли количество возвращаемых столбцов динамическим?Если да, то я не думаю, что это можно сделать с помощью функции SQL.

Если вы просто посмотрите на последний столбец - «сумма», вы можете использовать приведенный ниже код.

SELECTpower (2, RowID) -1

RowID - порядковый номер строки.

...