Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 реально такое сделать в sql ?  [new]
кириллk
Member

Откуда:
Сообщений: 1062
вообщем есть сумма 42612,45

и есть ряд (ок. 100) других сумм (45,12; 456,11; 111;88 итд) и поле datetime

вопрос: можно ли сказать сумма каких чисел может дать 42612,45 ?
26 дек 16, 21:19    [20050575]     Ответить | Цитировать Сообщить модератору
 Re: реально такое сделать в sql ?  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 21249
Да, реально. Правда, нецелесообразно...
26 дек 16, 21:56    [20050663]     Ответить | Цитировать Сообщить модератору
 Re: реально такое сделать в sql ?  [new]
Mike_za
Member

Откуда: Москва
Сообщений: 1176
Akina,

Перемножить все на все и так 100 раз... Многовато, нет?
Использовпть таки более поодящий математический алгоритм
26 дек 16, 23:04    [20050820]     Ответить | Цитировать Сообщить модератору
 Re: реально такое сделать в sql ?  [new]
Нектотам
Guest
кириллk,

declare @t table (
i int not null primary key
);
insert @t (i) values (1),(2),(3),(5),(7),(11),(13),(17),(19),(23),(29),(31);

declare @s int = 51;

with sums as (
select 
       t.i i, 
       isnull(sum(t2.i), 0) sum_i -- можно использовать sum() over order by, но у меня 2012 сервер
from 
       @t t 
       left join @t t2 on t.i>t2.i
group by t.i
),
rec as 
(
select 
       s.i i, 
       @s-s.i tail, 
       cast(i as nvarchar(max)) present
from 
       sums s
where 
       @s-s.i<=s.sum_i and @s-s.i>=0
union all 
select 
       s.i, 
       r.tail-s.i tail, 
       r.present + ' + '+ cast(s.i as nvarchar(max)) present
from 
       rec r 
       inner join sums s on r.i>s.i
where 
       r.tail-s.i<=s.sum_i and r.tail-s.i>=0
)
select * from rec where tail = 0


1. Написано для целых, но для decimal должно также работать. Для float корректная работа не гарантируется.
2. Написано для уникальных чисел, но можно переписать и для неуникальных. Кода больше, идея та же.
3. Сумма "хвоста" нужна, чтобы не так быстро валиться в экспоненциальную сложность.
4. В примере максимальная глубина рекурсии ограничена. См. option (maxrecursion N)
27 дек 16, 10:41    [20051710]     Ответить | Цитировать Сообщить модератору
 Re: реально такое сделать в sql ?  [new]
ДинВинчеста
Guest
declare @tab table (value int not null primary key);

insert into @tab(value) values
 (1),(2),(3),(4),(5),(6),(9), (10), (20), (30), (40), (60), (90), (100), (120), (200)

declare @sum int;
set @sum = 220;

with cte as (
	select 
		value,
		ROW_NUMBER() over (order by value) as id		
	from @tab
),
tree as (
	select CAST(value as varchar(max)) as sum_str, cast(null as bigint) as parent_id, id, value, value as sum_value from cte
	union all
	select 
	SUM_str + ' + ' + CAST(c.value as varchar(100)),
	t.id as parent_id, c.id, c.value, t.sum_value + c.value from tree t inner join cte c on c.id > t.id
	where t.sum_value + c.value <= @sum
)
select sum_str from tree where sum_value = @sum
27 дек 16, 11:48    [20052108]     Ответить | Цитировать Сообщить модератору
 Re: реально такое сделать в sql ?  [new]
кириллk
Member

Откуда:
Сообщений: 1062
Большое вам спасибо!

Всех с наступающим)
31 дек 16, 11:22    [20066136]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить