MYSQL 在行之间减去值,其中减去的数字与从中减去的行一起显示

问题描述 投票:0回答:1

我有一张像这样的桌子:

连接日期 mat_emp 休息
2018/2019 届前 AO-26 27.5
EX2019/2020 AO-26 30
EX2020/2021 AO-26 30
EX2021/2022 AO-26 30
EX2022/2023 AO-26 30

我想要的代码可以减去变量数字,在本例中为 40,我希望它从第一个“其余”列中减去它,并将减去的数量放在新行的开头,名称为“ rest-40”,并将“rest”值替换为该值剩余的数量(如果它低于 0,则将其设置为 0),并且它将从减数中得到剩余的数字(开始时为 40) )并从下一行减去 if 并使用减去的值减去下一行,直到剩余为 0 然后将表格停在那里,如下例所示,我想要相同的结果

休息-40 串联 mat_emp 休息
27.5 2018/2019 届前 AO-26 0
12.5 EX2019/2020 AO-26 17.5

注意:不要使用更新,因为这不是表,而是视图。

我多次尝试向chatGpt解释它,但没有给我任何满意的结果,这是最接近的结果:

SELECT 
    LEAST(rest, 40) as subtracted_value,
    concatenated_dates,
    mat_emp,
    GREATEST(rest - 40, 0) as remaining_rest
FROM 
    your_table
WHERE 
    rest > 0;

我希望它只从第一行减去 40,然后将剩下的 40 减去到下一行,依此类推,直到结果为 0,然后就完成了

mysql
1个回答
0
投票

这使用 UDV 来跟踪

rest
的累积和:

SELECT
    IF(40 - cum_sum < 0, 40 - (cum_sum - rest), rest) AS `rest-40`,
    concatenated_dates,
    mat_emp,
    (SELECT rest - `rest-40`) AS rest
FROM (
    SELECT yt1.*, @cum_sum := @cum_sum + rest AS cum_sum
    FROM your_table yt1
    JOIN (SELECT @cum_sum := 0) vars
    ORDER BY concatenated_dates
) AS cumulative
WHERE cum_sum - rest < 40;

这是一个db<>小提琴

© www.soinside.com 2019 - 2024. All rights reserved.