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

Откуда: Нижний Новгород
Сообщений: 845
Добрый день, добрый ALL!

Прошу помочь с решением задачи описать которую можно следующим образом.

Имеется 17 кг меда
Есть справочник медведей, кол-во записей в котором меняется.
Необходимо среди произвольных медведей-счастливцев произвольно распределить Весь объем меда.

Нужно распределять целое кол-во меда. Т.е. не 1,2 кг, а 1;2;5.

решаю задачу посредством преобора курсора+2х переменные отслежвающих оставшееся кол-во и назначающие кол-во для текущего Медведя.
По схеме

DECLARE crBears_Write CURSOR READ_ONLY FOR
DECLARE @BALANCE_CURR INT,@RND INT,@LIMIT INT
SET @LIMIT =17

DECLARE crBears_Write  CURSOR READ_ONLY FOR
SELECT ID
FROM dbo.Bears
order by rand(cast(cast(right(newid(),4) as varbinary) as integer))

OPEN crBears_Write 
FETCH next FROM crBears_Write INTO @ID
WHILE @@fetch_status = 0 AND @BALANCE_CURR>0
BEGIN

SET @BALANCE_CURR=@LIMIT-(SELECT SUM(COUNT_) FROM Распределено)

SET @RND=(select rand(cast(cast(right(newid(),4) as varbinary) as integer)))*15
SET @RND=round(@RND,0)
IF @RND>@BALANCE_CURR SET @RND=@BALANCE_CURR

INSERT INTO Распределено(ID,COUNT_) VALUES(@ID,@RND)


FETCH next FROM crBears_Write  INTO @ID
END


К обществу пристаю с вопросом: нельзя-ли отказаться в задаче от курсора и реализовать ее одним запросом.

Сообщение было отредактировано: 3 окт 11, 14:32
3 окт 11, 14:26    [11374185]     Ответить | Цитировать Сообщить модератору
 Re: Имитация викторины  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
vanoman
К обществу пристаю с вопросом...
Сообщество будет премного благодарно, если вы не будете использовать вырвиглазную цветовую схему, а код оформлять тегом SRC.
3 окт 11, 14:33    [11374266]     Ответить | Цитировать Сообщить модератору
 Re: Имитация викторины  [new]
vanoman
Member

Откуда: Нижний Новгород
Сообщений: 845
Гавриленко Сергей Алексеевич,

Спасибо, буду иметь в виду.
3 окт 11, 14:39    [11374341]     Ответить | Цитировать Сообщить модератору
 Re: Имитация викторины  [new]
Glory
Member

Откуда:
Сообщений: 104751
vanoman
Нужно распределять целое кол-во меда. Т.е. не 1,2 кг, а 1;2;5.

А излишки куда ?
3 окт 11, 14:40    [11374351]     Ответить | Цитировать Сообщить модератору
 Re: Имитация викторины  [new]
vanoman
Member

Откуда: Нижний Новгород
Сообщений: 845
Glory
vanoman
Нужно распределять целое кол-во меда. Т.е. не 1,2 кг, а 1;2;5.

А излишки куда ?


Исхожу из того что необходимо распределить весь объем.
В принципе факт неполного распределения можно отследить отдельным запросом и сообщить пользователю...

Для форума, считаем, что справочник медведей бесконечно большой и проблемы в недостатке получателей нет.
3 окт 11, 14:43    [11374380]     Ответить | Цитировать Сообщить модератору
 Re: Имитация викторины  [new]
iljy
Member

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

declare @max_bear int = 50, @total_honey int = 17
;with cte as
(
	select cast(ABS(CHECKSUM(newid())) % @max_bear as int) id, cast(ABS(CHECKSUM(NEWID()))%(@total_honey) as int) + 1 qty, 0 distr
		union all
	select cast(ABS(CHECKSUM(NEWID())) % @max_bear as int) id, cast(ABS(CHECKSUM(NEWID())) % (@total_honey - qty - distr) as int) + 1, distr+qty
	from cte
	where distr + qty < @total_honey
)
select id, qty from cte
option(maxrecursion 0)
сойдет?
3 окт 11, 15:01    [11374548]     Ответить | Цитировать Сообщить модератору
 Re: Имитация викторины  [new]
vanoman
Member

Откуда: Нижний Новгород
Сообщений: 845
iljy
vanoman,

declare @max_bear int = 50, @total_honey int = 17
;with cte as
(
	select cast(ABS(CHECKSUM(newid())) % @max_bear as int) id, cast(ABS(CHECKSUM(NEWID()))%(@total_honey) as int) + 1 qty, 0 distr
		union all
	select cast(ABS(CHECKSUM(NEWID())) % @max_bear as int) id, cast(ABS(CHECKSUM(NEWID())) % (@total_honey - qty - distr) as int) + 1, distr+qty
	from cte
	where distr + qty < @total_honey
)
select id, qty from cte
option(maxrecursion 0)
сойдет?


Да, отлично!
Алгоритм вполне прилепить можно к рабочим таблицам.

Теперь я в ситуации видит око да зуб неймет. У меня 2000 SQL
3 окт 11, 15:29    [11374836]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить