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

Откуда: Россия, Симферополь
Сообщений: 66
Есть таблица c int полями ID и Count:

ID Count
1 - 18
2 - 6
3 - 11
4 - 1
5 - 6

Есть переменная с текущим значением = 37

Как 37? распределить по таблице, что бы в итоге получилось:

Select

1 - 18
2 - 2
3 - 11
5 - 6
11 сен 15, 15:27    [18138507]     Ответить | Цитировать Сообщить модератору
 Re: Уважаемые Гуру помогите разложить целое число  [new]
Добрый Э - Эх
Guest
Nik_Kurta,

об алгоритме "разложения" предлагается догодаться?
11 сен 15, 15:40    [18138597]     Ответить | Цитировать Сообщить модератору
 Re: Уважаемые Гуру помогите разложить целое число  [new]
Добрый Э - Эх
Guest
Nik_Kurta,

что делать в случаях, когда никакая комбинация count-ов не позволяет в сумме получить заданное значение?
11 сен 15, 15:42    [18138613]     Ответить | Цитировать Сообщить модератору
 Re: Уважаемые Гуру помогите разложить целое число  [new]
Nik_Kurta
Member

Откуда: Россия, Симферополь
Сообщений: 66
Добрый Э - Эх, выйти из процедуры и выдать сообщение пользователю о ошибке!
11 сен 15, 15:47    [18138654]     Ответить | Цитировать Сообщить модератору
 Re: Уважаемые Гуру помогите разложить целое число  [new]
Nik_Kurta
Member

Откуда: Россия, Симферополь
Сообщений: 66
Добрый Э - Эх, алгоритм обычный, начинаем с максимального значения Count. Допустим переменная получила значение = 18, тогда ID = 1 и Count = 18 далее выходим из процедуры. Если переменная получила значение допустим < 18, тогда ID = 1 а Count = 18 - значение переменной. Выход из процедуры.
11 сен 15, 15:53    [18138701]     Ответить | Цитировать Сообщить модератору
 Re: Уважаемые Гуру помогите разложить целое число  [new]
Nik_Kurta
Member

Откуда: Россия, Симферополь
Сообщений: 66
Задачка такая! На полках от 1 до 5, лежат яблоки по соответствию: 1 полка - 18 яблок, 2 полка - 6 яблок и т.д.
Пришёл Буратино и попросил 37 яблок! Мы ему должны выдать их начиная с № полки с максимальным кол-вом яблок. Т.е. 1 полка - 18 шт., 3 полка - 11 шт., 5 полка - 6 шт., пока не наберём 37! Прошу помощи! Голова сейчас лопнет.
11 сен 15, 16:47    [18139086]     Ответить | Цитировать Сообщить модератору
 Re: Уважаемые Гуру помогите разложить целое число  [new]
SQL2008
Member

Откуда: Москва
Сообщений: 4478
Nik_Kurta
Добрый Э - Эх, алгоритм обычный, начинаем с максимального значения Count. Допустим переменная получила значение = 18, тогда ID = 1 и Count = 18 далее выходим из процедуры. Если переменная получила значение допустим < 18, тогда ID = 1 а Count = 18 - значение переменной. Выход из процедуры.



Nik_Kurta
Как 37 распределить по таблице, что бы в итоге получилось:

Select

1 - 18
2 - 2
3 - 11
5 - 6


Наверно все дело в пятнице, но не вижу тут никакой логической цепочки, кроме весьма условной

автор
Допустим переменная получила значение = 18, тогда ID = 1 и Count = 18 далее выходим из процедуры

и
автор
1 - 18

Так как 37 <> 18

Похоже, что вы что-то недоговариваете. Давайте еще раз и на человеческом языке опишите алгоритм распределения значений.
11 сен 15, 16:47    [18139087]     Ответить | Цитировать Сообщить модератору
 Re: Уважаемые Гуру помогите разложить целое число  [new]
SQL2008
Member

Откуда: Москва
Сообщений: 4478
Nik_Kurta
... Пришёл Буратино ...

С этого нужно было начинать!
11 сен 15, 16:49    [18139096]     Ответить | Цитировать Сообщить модератору
 Re: Уважаемые Гуру помогите разложить целое число  [new]
Konst_One
Member

Откуда:
Сообщений: 11621
https://www.sql.ru/forum/834066/pomogite-pls-razlozhit-yabloki-po-korzinam
11 сен 15, 16:51    [18139109]     Ответить | Цитировать Сообщить модератору
 Re: Уважаемые Гуру помогите разложить целое число  [new]
SQL2008
Member

Откуда: Москва
Сообщений: 4478
Nik_Kurta
Как 37 распределить по таблице, что бы в итоге получилось:

Select

1 - 18
2 - 2
3 - 11
5 - 6


1. Сравниваете остаток с максимальным значением на полке.
2. если остаток больше, то отмечаете эту полку и вычитаете из остатка, переходите к п.1
3. если остаток меньше, то сравнивате со следующим после максимального значением и переходите к п.2
Делаете, пока не наберете нужное количество.

Есть вероятность, что в конце не сможете набрать точно, тогда откатываетесь на 2 шага назад и начинаете снова.
11 сен 15, 16:55    [18139136]     Ответить | Цитировать Сообщить модератору
 Re: Уважаемые Гуру помогите разложить целое число  [new]
SQL2008
Member

Откуда: Москва
Сообщений: 4478
Konst_One, нет! Там ничего не говорится про Буратино!
Условия задачи не соблюдены!
11 сен 15, 16:57    [18139151]     Ответить | Цитировать Сообщить модератору
 Re: Уважаемые Гуру помогите разложить целое число  [new]
Nik_Kurta
Member

Откуда: Россия, Симферополь
Сообщений: 66
SQL2008, в результате нужно получить список № полок и сколько оттуда взяли яблок. Итог такой: с 1-й взяли 18, с 3 - 11 яблок, с 5 - 6, с 2 - всего 2, остаток на второй - 4 яблока. А с 4 полки вообще не брали ничего, её не учитываем! Как собака, всё понимаю, а сказать, вернее составить запрос, не могу.
11 сен 15, 17:06    [18139194]     Ответить | Цитировать Сообщить модератору
 Re: Уважаемые Гуру помогите разложить целое число  [new]
aleks2
Guest
set nocount on;
declare @t table(ID int, Count int);

insert @t values(1, 18)
insert @t values(2, 6)
insert @t values(3, 11)
insert @t values(4, 1)
insert @t values(5, 6)

declare @cnt int;
set @cnt=37;

with
ordered as (select *, ROW_NUMBER() over(order by Count DESC) as n from @t)
,
x as (
select top(1) CAST(0 as int) as total
     , CAST(null as int) as count
     , CAST(null as int) as id
     , CAST(null as int) as count0
     , cast( 0 as bigint ) as n 
union all
select case when x.total+o.count >=@cnt then @cnt else x.total+o.count end as total
      , case when x.total+o.count <= @cnt then o.count else (@cnt - x.total) end
      , o.id
      , o.count
      , o.n 
from x inner join ordered o on x.n+1 = o.n
  where x.total<@cnt
 )
select * from x; 
11 сен 15, 19:10    [18139784]     Ответить | Цитировать Сообщить модератору
 Re: Уважаемые Гуру помогите разложить целое число  [new]
Makar4ik
Member

Откуда: Когда-то были Лужки, а теперь Бордюр-Сити.
Сообщений: 2680
aleks2,

insert @t values(1, 1)
insert @t values(2, 2)
insert @t values(3, 3)
insert @t values(4, 7)
insert @t values(5, 13)
insert @t values(6, 21)
insert @t values(7, 34)
insert @t values(8, 55)
insert @t values(9, 89)
insert @t values(10, 144)
insert @t values(11, 200)
и всё разлетелось
11 сен 15, 21:29    [18140273]     Ответить | Цитировать Сообщить модератору
 Re: Уважаемые Гуру помогите разложить целое число  [new]
aleks2
Guest
Makar4ik
aleks2,

insert @t values(1, 1)
insert @t values(2, 2)
insert @t values(3, 3)
insert @t values(4, 7)
insert @t values(5, 13)
insert @t values(6, 21)
insert @t values(7, 34)
insert @t values(8, 55)
insert @t values(9, 89)
insert @t values(10, 144)
insert @t values(11, 200)
и всё разлетелось


Зачем брешешь, дарагой, а?

37 37 11 200 1
12 сен 15, 13:29    [18141841]     Ответить | Цитировать Сообщить модератору
 Re: Уважаемые Гуру помогите разложить целое число  [new]
Nik_Kurta
Member

Откуда: Россия, Симферополь
Сообщений: 66
aleks2, огромное тебе спасибо!!! Проверил работу процедуры с разными значениями переменной, всё работает на ура! Сам бы, до такого решения задачи, явно бы не дошёл. Всё пытался решить с помощью курсора, но ни как. Респект и уважение тебе! Тема закрыта.
12 сен 15, 18:06    [18142445]     Ответить | Цитировать Сообщить модератору
 Re: Уважаемые Гуру помогите разложить целое число  [new]
Makar4ik
Member

Откуда: Когда-то были Лужки, а теперь Бордюр-Сити.
Сообщений: 2680
aleks2
Makar4ik
aleks2,

insert @t values(1, 1)
insert @t values(2, 2)
insert @t values(3, 3)
insert @t values(4, 7)
insert @t values(5, 13)
insert @t values(6, 21)
insert @t values(7, 34)
insert @t values(8, 55)
insert @t values(9, 89)
insert @t values(10, 144)
insert @t values(11, 200)
и всё разлетелось


Зачем брешешь, дарагой, а?

37 37 11 200 1

37 37 11 200 1 - это насколько я понял, он сходу выбрал 11-ю строку, со значением 200, понял, что она > 37, и успокоился.

Я верно понимаю, что ТС хотел не 200, а 34+3, или 21+13+2+1?
12 сен 15, 23:02    [18143083]     Ответить | Цитировать Сообщить модератору
 Re: Уважаемые Гуру помогите разложить целое число  [new]
o-o
Guest
Makar4ik
37 37 11 200 1 - это насколько я понял, он сходу выбрал 11-ю строку, со значением 200, понял, что она > 37, и успокоился.
Я верно понимаю, что ТС хотел не 200, а 34+3, или 21+13+2+1?

как раз в своем алгоритме ТС набирает заказанное,
начиная с самых "крупных купюр", как банкомат:
Nik_Kurta
Добрый Э - Эх, алгоритм обычный, начинаем с максимального значения Count. Допустим переменная получила значение = 18, тогда ID = 1 и Count = 18 далее выходим из процедуры. Если переменная получила значение допустим < 18, тогда ID = 1 а Count = 18 - значение переменной. Выход из процедуры.

зачем лишние телодвижения совершать, если полка с 200 в состоянии обслужить?
не нравится -- убирайте "крупные" полки,
будет вам "мелкими".
напраслину возводите, товарищ Картинка с другого сайта.
12 сен 15, 23:45    [18143153]     Ответить | Цитировать Сообщить модератору
 Re: Уважаемые Гуру помогите разложить целое число  [new]
vikkiv
Member

Откуда: EU
Сообщений: 2960
o-o
...зачем лишние телодвижения совершать, если полка с 200 в состоянии обслужить?...
обслуживание с полки содержащими 200 единиц потребует дополнительного счёта, а для решения с несколькими (или одной) полными полками необходимо будет просто сгрести в корзину всё что есть на полке (без счёта, просто по номерам полок)..
что если нужно будет 569 яблок отсчитать с полки на 1000? по одному считать или примерно половину отгрести?
13 сен 15, 03:00    [18143475]     Ответить | Цитировать Сообщить модератору
 Re: Уважаемые Гуру помогите разложить целое число  [new]
o-o
Guest
У ТС в примере бывают полки с повторяющимися количествами, так что если утрировать, то могут быть и 1000 полок по 1 яблоку. Так что считать придется все равно. Ну и если уж тут конкурс извращенной фантазии, то могу инпут еще интереснее обустроить: полки на разных этажах небоскреба и некий шутник расположил их так, что на каждом этаже есть ровно 2 полки, содержащие яблоки: на одной 1000, на другой 1.
Ну так по вашей версии будем посещать 569 комнат, т. е. убегаетесь/укатаете лифт, а алекс тем временем сгребет свои яблоки не отходя от кассыКартинка с другого сайта.
13 сен 15, 09:15    [18143583]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить