Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 用户的分发订单_Sql_Sql Server - Fatal编程技术网

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你不明白什么?我只是懒得读那些代码。。。