Sql 用户的分发订单
我有订单和用户。我平均分配每个用户的订单。 我需要在添加新用户时重新分发。在算法中,需要考虑满足的极限和极限之间的差异。如果用户对第一个发行版进行了限制,则他们不会将其包括在新发行版中,并将该列暴露于所做列的限制值Sql 用户的分发订单,sql,sql-server,Sql,Sql Server,我有订单和用户。我平均分配每个用户的订单。 我需要在添加新用户时重新分发。在算法中,需要考虑满足的极限和极限之间的差异。如果用户对第一个发行版进行了限制,则他们不会将其包括在新发行版中,并将该列暴露于所做列的限制值 declare @orderCount int set @orderCount = 50 --Orders for Distribution --Result table declare @t table ( users char(3),
declare @orderCount int
set @orderCount = 50 --Orders for Distribution
--Result table
declare @t table (
users char(3),
limit int,
Made int
)
--Add users
insert into @t (users, limit, Made) values
('us1',0,0),
('us2',0,0),
('us3',0,0)
--Table for the Distribution algorithm
declare @c table (
users char(3),
limit int,
Made int,
Cnt int,
Rn int
)
--Count users and row_number
insert into @c
select
*,
COUNT(*) OVER () as Cnt,
ROW_NUMBER() OVER (ORDER BY users) as Rn
from
@t
--var for check new distribution>made
DECLARE @check int = 0
--Distribution
update t
set @check = (@orderCount/Cnt) + CASE WHEN @orderCount % Cnt >= Rn THEN 1 ELSE 0 END,
limit=
CASE WHEN
(@check >= t.Made)
THEN
@check
ELSE
t.Made
END
FROM @t t
INNER JOIN @c cn ON cn.users=t.users
--Test data
UPDATE @t SET Made=12 WHERE users='us1'
UPDATE @t SET Made=10 WHERE users='us2'
UPDATE @t SET Made=5 WHERE users='us3'
--Check result
SELECT * FROM @t
--add to distribution new users
INSERT INTO @t (users, limit, Made) values ('us4',0,0)
INSERT INTO @t (users, limit, Made) values ('us5',0,0)
--Clear table
DELETE FROM @c
--Check new data
insert into @c
select
*,
COUNT(*) OVER () as Cnt,
ROW_NUMBER() OVER (ORDER BY users) as Rn
from
@t
--Distribution
update t
set @check = (@orderCount/Cnt) + CASE WHEN @orderCount % Cnt >= Rn THEN 1 ELSE 0 END,
limit=
CASE WHEN
(@check >= t.Made)
THEN
@check
ELSE
t.Made
END
FROM @t t
INNER JOIN @c cn ON cn.users=t.users
--Check result
SELECT * FROM @t
它划分用户的订单数量。1个用户50/3~16个订单。如果我添加2个新用户,则为50/5~10。但是1个用户做12个订单。12个新的分销订单(10个)。然后他进入第12栏。50-12=38。然后38/4~9命令剩余的UESR。选择x.users,
SELECT x.users,
x.work,
x.Made,
sum(CASE WHEN Made>NewLimit THEN Made ELSE 0 END) OVER() as Dif,
count(CASE WHEN Made<NewLimit THEN NewLimit END) OVER() as Cnt,
CASE WHEN Made>NewLimit THEN 0 ELSE 1 END as IsUsed,
(CASE WHEN Made<NewLimit THEN
ROW_NUMBER() OVER (PARTITION BY x.work, (case when Made<NewLimit then 1 else 0 end) ORDER BY work) ELSE 0 END) as Rn
FROM (
SELECT t.users ,(@orderCount/Cnt) + CASE WHEN @orderCount % Cnt >= Rn THEN 1 ELSE 0 END as NewLimit,
t.Made,
t.work
FROM @t t
INNER JOIN @c cn ON cn.users=t.users
) x
x、 工作,,
x、 制造,
将()上的和(生成时的大小写>NewLimit,然后生成ELSE 0 END)作为Dif,
计数(MadeNewLimit然后为0,否则为1,使用时结束),
(在制作时使用哪种dbms?(该代码是特定于产品的。)使其易于帮助您!阅读并)使用ms sqlserver@jarlh你不明白什么?我只是懒得读那些代码。。。