powered by simpleCommunicator - 2.0.39     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Уважаемые Гуру помогите разложить целое число
20 сообщений из 20, страница 1 из 1
Уважаемые Гуру помогите разложить целое число
    #39049319
Фотография Nik_Kurta
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть таблица 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
...
Рейтинг: 0 / 0
Уважаемые Гуру помогите разложить целое число
    #39049335
Nik_Kurta,

об алгоритме "разложения" предлагается догодаться?
...
Рейтинг: 0 / 0
Уважаемые Гуру помогите разложить целое число
    #39049338
Nik_Kurta,

что делать в случаях, когда никакая комбинация count-ов не позволяет в сумме получить заданное значение?
...
Рейтинг: 0 / 0
Уважаемые Гуру помогите разложить целое число
    #39049348
Фотография Nik_Kurta
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый Э - Эх, выйти из процедуры и выдать сообщение пользователю о ошибке!
...
Рейтинг: 0 / 0
Уважаемые Гуру помогите разложить целое число
    #39049358
Фотография Nik_Kurta
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый Э - Эх, алгоритм обычный, начинаем с максимального значения Count. Допустим переменная получила значение = 18, тогда ID = 1 и Count = 18 далее выходим из процедуры. Если переменная получила значение допустим < 18, тогда ID = 1 а Count = 18 - значение переменной. Выход из процедуры.
...
Рейтинг: 0 / 0
Уважаемые Гуру помогите разложить целое число
    #39049442
Фотография Nik_Kurta
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Задачка такая! На полках от 1 до 5, лежат яблоки по соответствию: 1 полка - 18 яблок, 2 полка - 6 яблок и т.д.
Пришёл Буратино и попросил 37 яблок! Мы ему должны выдать их начиная с № полки с максимальным кол-вом яблок. Т.е. 1 полка - 18 шт., 3 полка - 11 шт., 5 полка - 6 шт., пока не наберём 37! Прошу помощи! Голова сейчас лопнет.
...
Рейтинг: 0 / 0
Уважаемые Гуру помогите разложить целое число
    #39049443
Фотография SQL2008
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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

Похоже, что вы что-то недоговариваете. Давайте еще раз и на человеческом языке опишите алгоритм распределения значений.
...
Рейтинг: 0 / 0
Уважаемые Гуру помогите разложить целое число
    #39049447
Фотография SQL2008
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nik_Kurta... Пришёл Буратино ...
С этого нужно было начинать!
...
Рейтинг: 0 / 0
Уважаемые Гуру помогите разложить целое число
    #39049452
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Уважаемые Гуру помогите разложить целое число
    #39049459
Фотография SQL2008
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nik_Kurta Как 37 распределить по таблице, что бы в итоге получилось:

Select

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

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

Есть вероятность, что в конце не сможете набрать точно, тогда откатываетесь на 2 шага назад и начинаете снова.
...
Рейтинг: 0 / 0
Уважаемые Гуру помогите разложить целое число
    #39049461
Фотография SQL2008
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Konst_One, нет! Там ничего не говорится про Буратино!
Условия задачи не соблюдены!
...
Рейтинг: 0 / 0
Уважаемые Гуру помогите разложить целое число
    #39049472
Фотография Nik_Kurta
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SQL2008, в результате нужно получить список № полок и сколько оттуда взяли яблок. Итог такой: с 1-й взяли 18, с 3 - 11 яблок, с 5 - 6, с 2 - всего 2, остаток на второй - 4 яблока. А с 4 полки вообще не брали ничего, её не учитываем! Как собака, всё понимаю, а сказать, вернее составить запрос, не могу.
...
Рейтинг: 0 / 0
Уважаемые Гуру помогите разложить целое число
    #39049631
aleks2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
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; 
...
Рейтинг: 0 / 0
Уважаемые Гуру помогите разложить целое число
    #39049711
Фотография Makar4ik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aleks2,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
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)

и всё разлетелось
...
Рейтинг: 0 / 0
Уважаемые Гуру помогите разложить целое число
    #39049888
aleks2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Makar4ikaleks2,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
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
...
Рейтинг: 0 / 0
Уважаемые Гуру помогите разложить целое число
    #39049990
Фотография Nik_Kurta
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aleks2, огромное тебе спасибо!!! Проверил работу процедуры с разными значениями переменной, всё работает на ура! Сам бы, до такого решения задачи, явно бы не дошёл. Всё пытался решить с помощью курсора, но ни как. Респект и уважение тебе! Тема закрыта.
...
Рейтинг: 0 / 0
Уважаемые Гуру помогите разложить целое число
    #39050079
Фотография Makar4ik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aleks2Makar4ikaleks2,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
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?
...
Рейтинг: 0 / 0
Уважаемые Гуру помогите разложить целое число
    #39050092
o-o
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
o-o
Гость
Makar4ik37 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 в состоянии обслужить?
не нравится -- убирайте "крупные" полки,
будет вам "мелкими".
напраслину возводите, товарищ
...
Рейтинг: 0 / 0
Уважаемые Гуру помогите разложить целое число
    #39050127
Фотография vikkiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
o-o...зачем лишние телодвижения совершать, если полка с 200 в состоянии обслужить?...обслуживание с полки содержащими 200 единиц потребует дополнительного счёта, а для решения с несколькими (или одной) полными полками необходимо будет просто сгрести в корзину всё что есть на полке (без счёта, просто по номерам полок)..
что если нужно будет 569 яблок отсчитать с полки на 1000? по одному считать или примерно половину отгрести?
...
Рейтинг: 0 / 0
Уважаемые Гуру помогите разложить целое число
    #39050142
o-o
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
o-o
Гость
У ТС в примере бывают полки с повторяющимися количествами, так что если утрировать, то могут быть и 1000 полок по 1 яблоку. Так что считать придется все равно. Ну и если уж тут конкурс извращенной фантазии, то могу инпут еще интереснее обустроить: полки на разных этажах небоскреба и некий шутник расположил их так, что на каждом этаже есть ровно 2 полки, содержащие яблоки: на одной 1000, на другой 1.
Ну так по вашей версии будем посещать 569 комнат, т. е. убегаетесь/укатаете лифт, а алекс тем временем сгребет свои яблоки не отходя от кассы
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Уважаемые Гуру помогите разложить целое число
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]