Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.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,我需要为用户分配订单数量。 假设有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

我需要为用户分配订单数量。 假设有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 2
美国2
us3 2
美国4 2
美国5 3
声明@countInterval int=13
--声明@sum int=5
声明@countUser int=5
更新DistributionBasesUsers
设置@countUser=@countUser-1、@countInterval=@countInterval-2、DistributionBaseCountOrder=
案例
当@countUser>0时,则为楼层(@countInterval/@countUser),否则为0

--当FLOOR(@countInterval/@countUser)时,我得到了与您要求的类似的东西。对于第二个示例,我给出的结果与您的不同,我不确定更新的目的是什么:

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

如果我们在
@t
中添加一个可为空的
orders int
列,那么我们可以将最终查询更改为:

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

如果这是
更新的目的
。(如果您以前没有看到过,通过进行更新可能会引起不安)

您使用的是MySQL还是MS SQL Server?(不要添加不相关的标签)等等,这里的逻辑是什么?在您的第一个示例中,当用户数量没有准确地除以订单数量时,较低数量的用户似乎收到了“超额”。但在您的第二个示例中,情况似乎正好相反。对不起,我正在使用MS SQLNice tip(更新CTE)。另一个级别:您也可以更新基于cte的表值函数:)