我一直在试图找到一种编写SQL脚本以选择给定总和的方法,并希望能为此提供任何想法。
我正在尝试根据收到的货物的日期进行库存评估。在月底收盘时,我在仓库中剩余的库存价值将是最后收到的货物的指定总和。
以下查询由两个联合完成,但简化为:
SELECT DATE, W1 FROM Table
ORDER BY DATE DESC
查询结果:
Row DATE W1
1 2019-02-28 00:00:00 13250
2 2019-02-28 00:00:00 42610
3 2019-02-28 00:00:00 41170
4 2019-02-28 00:00:00 13180
5 2019-02-28 00:00:00 20860
6 2019-02-28 00:00:00 19870
7 2019-02-28 00:00:00 37780
8 2019-02-28 00:00:00 47210
9 2019-02-28 00:00:00 32000
10 2019-02-28 00:00:00 41930
我曾考虑过通过如下计算累计和来解决此问题:
Row DATE W1 Cumulative Sum
1 2019-02-28 00:00:00 13250 13250
2 2019-02-28 00:00:00 42610 55860
3 2019-02-28 00:00:00 41170 97030
4 2019-02-28 00:00:00 13180 110210
5 2019-02-28 00:00:00 20860 131070
6 2019-02-28 00:00:00 19870 150940
7 2019-02-28 00:00:00 37780 188720
8 2019-02-28 00:00:00 47210 235930
9 2019-02-28 00:00:00 32000 267930
10 2019-02-28 00:00:00 41930 309860
但是,当我想出一种使用参数只返回感兴趣的行的方法时,我会陷入困境。
例如,如果将参数指定为“ 120000”,它将返回累计总和正好为120000的行。
Row DATE W1 Cumulative Sum W1_Select
1 2019-02-28 00:00:00 13250 13250 13250
2 2019-02-28 00:00:00 42610 55860 42610
3 2019-02-28 00:00:00 41170 97030 41170
4 2019-02-28 00:00:00 13180 110210 13180
5 2019-02-28 00:00:00 20860 131070 9790
----------
Total 120000
答案 0 :(得分:0)
这只需要一些算术运算即可:
select t.*,
(case when running_sum < @threshold then w1
else @threshold - w1
end)
from (select date, w1, sum(w1) over (order by date) as running_sum
from t
) t
where running_sum - w1 < @threshold;
实际上,对于您而言,日期都是相同的。这有点违反直觉,但是您需要使用该行才能起作用:
select t.*,
(case when running_sum < @threshold then w1
else @threshold - w1
end)
from (select date, w1, sum(w1) over (order by row) as running_sum
from t
) t
where running_sum - w1 < @threshold;
Here是db <>小提琴。