sql中没有循环的均匀分布

时间:2018-08-23 07:20:03

标签: sql sql-server

我需要为用户分配订单数。 假设有3个订单和5个用户。

users    orders
    us1 1
    us2 1
    us3 1
    us4 0
    us5 0

11个订单和5个用户

users    orders
    us1 2
    us2 2
    us3 2
    us4 2
    us5 3


DECLARE @countInterval int = 13
--DECLARE @sum int = 5
DECLARE @countUser int = 5
        Update DistributionBasesUsers 
            SET  @countUser=@countUser-1, @countInterval=@countInterval-2, DistributionBaseCountOrder=
                CASE 
                    WHEN @countUser>0 THEN FLOOR(@countInterval/@countUser) ELSE 0
                    --WHEN FLOOR(@countInterval/@countUser)<0 THEN @countInterval%5
                    --WHEN FLOOR(@countInterval/@countUser)=0 THEN 0
                END

1 个答案:

答案 0 :(得分:2)

我得到的东西与您要的东西相似。对于您的第二个示例,我给出的结果与您给出的结果不同,并且我不确定update的含义:

declare @t table (users char(3))
insert into @t(users) values
('us1'),
('us2'),
('us3'),
('us4'),
('us5')

declare @orderCount int
set @orderCount = 13

;With CountedNumbered as (
    select
        *,
        COUNT(*) OVER () as Cnt,
        ROW_NUMBER() OVER (ORDER BY users) as Rn
    from
        @t
)
select
    users,
    (@orderCount / Cnt) +
    CASE WHEN @orderCount % Cnt >= Rn THEN 1 ELSE 0 END as orders
from
    CountedNumbered

结果:

users orders
----- -----------
us1   3
us2   3
us3   3
us4   2
us5   2

如果我们向orders int添加可为空的@t列,则可以将最终查询更改为:

update CountedNumbered
set orders = 
    (@orderCount / Cnt) +
    CASE WHEN @orderCount % Cnt >= Rn THEN 1 ELSE 0 END

如果这是您的update的意图。 (如果您以前没有看到过通过CTEs进行更新的消息,那么可能会令人讨厌)