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

Откуда:
Сообщений: 67
Есть таблица типа:
1 Иванов 500,00
2 Петров 1200,00
3 Сидоров 500,00
4 Терентьев 500,00

Х=2200,00

надо получить набор данных сумма которых =2200,00
1 Иванов 500,00
2 Петров 1200,00
3 Сидоров 500,00

как это сделать?
11 сен 16, 23:50    [19653017]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать записи пока сумма не будет равна Х  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37068
Прочитать про нарастающий итог
12 сен 16, 00:11    [19653037]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать записи пока сумма не будет равна Х  [new]
aleks2
Guest
dim---76
Есть таблица типа:
1 Иванов 500,00
2 Петров 1200,00
3 Сидоров 500,00
4 Терентьев 500,00

Х=2200,00

надо получить набор данных сумма которых =2200,00
1 Иванов 500,00
2 Петров 1200,00
3 Сидоров 500,00

как это сделать?


А если Х=1500,00, нибось, надо

1 Иванов 500,00
3 Сидоров 500,00
4 Терентьев 500,00

А если Х=600,00, чего надо?

Вангую тредстартер открыл для себя задачу о рюкзаке...
12 сен 16, 07:14    [19653170]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать записи пока сумма не будет равна Х  [new]
982183
Member

Откуда: VL
Сообщений: 3355
Старая, старая задача про полную заполняемость вагона грузами.
12 сен 16, 09:07    [19653296]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать записи пока сумма не будет равна Х  [new]
0-0
Guest
dim---76,

declare @t table (id int, name nvarchar(100), summ decimal(23,2))


insert into @t(id, name, summ)
select 1, N'Иванов', 500.00 union all
select 2, N'Петров', 1200.00 union all
select 3, N'Сидоров', 500.00 union all
select 4, N'Терентьев', 500.00


declare @X decimal(23,2) = 2200


select A.id, A.summ from(
select a.id, max(a.summ) as summ, sum(isnull(b.summ, 0))+max(a.summ) as tot_sum
from @t a 
left outer join @t b on b.id < a.id
group by a.id)A
where A.tot_sum <= @X
12 сен 16, 10:12    [19653541]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать записи пока сумма не будет равна Х  [new]
0-0
Guest
982183
Старая, старая задача про полную заполняемость вагона грузами.


На T-SQL решается вменяемым способом?
12 сен 16, 10:15    [19653556]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать записи пока сумма не будет равна Х  [new]
dim---76
Member

Откуда:
Сообщений: 67
aleks2,

именно эта задача и стоит ((
12 сен 16, 11:36    [19653943]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать записи пока сумма не будет равна Х  [new]
dim---76
Member

Откуда:
Сообщений: 67
0-0,

у меня пока только через курсор мысль работает, но думал может запросом можно
12 сен 16, 11:40    [19653959]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать записи пока сумма не будет равна Х  [new]
Bator
Member

Откуда: Порт пяти морей
Сообщений: 439
dim---76,

Тут уже писали про "накопительный итог", гуглить не получилось?
https://www.google.ru/search?q=ms sql накопительный итог&ie=utf-8&oe=utf-8&gws_rd=cr&ei=FHLWV9e3GMacsAGZwKPACg

https://msdn.microsoft.com/ru-ru/library/ms189461.aspx
12 сен 16, 12:15    [19654107]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать записи пока сумма не будет равна Х  [new]
0-0
Guest
ИМХО, SQL-сервер не для таких задач
12 сен 16, 12:25    [19654142]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать записи пока сумма не будет равна Х  [new]
aleks2
Guest
0-0
ИМХО, SQL-сервер не для таких задач

Да ладно те, реализовать упрощенные алгоритмы заполнения рюкзака можно.
И T-SQL ничем не хуже других будет.
12 сен 16, 14:03    [19654504]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать записи пока сумма не будет равна Х  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4804
dim---76
0-0,

у меня пока только через курсор мысль работает, но думал может запросом можно


declare @t table (id int, name nvarchar(100), summ decimal(23,2))

insert into @t(id, name, summ)
select 1, N'Иванов', 500.00 union all
select 2, N'Петров', 1200.00 union all
select 3, N'Сидоров', 500.00 union all
select 4, N'Терентьев', 500.00


declare @X decimal(23,2) = 2200

SELECT * FROM 
(
	SELECT *, running_total = SUM(summ) OVER (ORDER BY id ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) FROM @t 
) a 
WHERE running_total <= @X
ORDER BY id
12 сен 16, 14:40    [19654644]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать записи пока сумма не будет равна Х  [new]
iljy
Member

Откуда:
Сообщений: 8711
dim---76,

что, у студентов курсовые? Совсем недавно была тема, тоже через курсоры собирался чувак решать.
12 сен 16, 14:40    [19654649]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать записи пока сумма не будет равна Х  [new]
982183
Member

Откуда: VL
Сообщений: 3355
Нащел.
Это частный случай "Задача о ранце"


https://ru.wikipedia.org/wiki/Задача_о_ранце
12 сен 16, 16:06    [19655158]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать записи пока сумма не будет равна Х  [new]
982183
Member

Откуда: VL
Сообщений: 3355
http://dic.academic.ru/dic.nsf/ruwiki/922893
12 сен 16, 16:08    [19655168]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать записи пока сумма не будет равна Х  [new]
dim---76
Member

Откуда:
Сообщений: 67
a_voronin,

это работает только по порядку, а если надо к примеру на 1000 выбрать то 2 по 500 она не даст
12 сен 16, 17:03    [19655439]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать записи пока сумма не будет равна Х  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4804
dim---76
a_voronin,

это работает только по порядку, а если надо к примеру на 1000 выбрать то 2 по 500 она не даст


Не понял, что вы имеете ввиду, но есть ещё PARTITION BY
12 сен 16, 18:59    [19655949]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать записи пока сумма не будет равна Х  [new]
dim---76
Member

Откуда:
Сообщений: 67
a_voronin, вот так

aleks2

А если Х=1500,00, нибось, надо

1 Иванов 500,00
3 Сидоров 500,00
4 Терентьев 500,00

А если Х=600,00, чего надо?



сделал через курсор, может не так красиво но работает
13 сен 16, 00:40    [19657095]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать записи пока сумма не будет равна Х  [new]
iljy
Member

Откуда:
Сообщений: 8711
dim---76,

до чего ж студент пошел ленивый, не то что подумать, даже тему прочитать лень. Чуть что - сразу давай за курсор хвататься и совать его куда ни попадя.
13 сен 16, 02:21    [19657148]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить