【发布时间】:2014-04-09 18:23:19
【问题描述】:
我正在使用 SQL Server 2012 构建库存计划/再订购引擎。
我有一堆过时的交易,称它们为贷方和借方。我想同时做两件事:
- 生成运行总计(每日净余额)
- 生成补充建议。 Replenish 将重置 Running 总计(在 #1 中)归零。
表格如下所示:
CREATE TABLE TX (TDate DATETIME, Qty INT);
INSERT INTO TX VALUES ('2014-03-01', 20);
INSERT INTO TX VALUES ('2014-03-02',-10);
INSERT INTO TX VALUES ('2014-03-03',-20);
INSERT INTO TX VALUES ('2014-03-04',-10);
INSERT INTO TX VALUES ('2014-03-05', 30);
INSERT INTO TX VALUES ('2014-03-06',-20);
INSERT INTO TX VALUES ('2014-03-07', 10);
INSERT INTO TX VALUES ('2014-03-08',-20);
INSERT INTO TX VALUES ('2014-03-09', -5);
我正在使用 SQL 2012 SUM OVER() 窗口函数来显示这些的运行总计。
select TDate, Qty, RunningTotal, RecommendedReplenish from (
select
TDate,
Qty,
SUM(Qty) OVER (ORDER BY TDate ROWS UNBOUNDED PRECEDING) as RunningTotal,
-1 * (CASE WHEN Qty < 0 AND SUM(Qty) OVER (ORDER BY TDate ROWS UNBOUNDED PRECEDING) < 0
THEN
CASE WHEN Qty > SUM(Qty) OVER (ORDER BY TDate ROWS UNBOUNDED PRECEDING) THEN Qty ELSE SUM(Qty) OVER (ORDER BY TDate ROWS UNBOUNDED PRECEDING) END
ELSE 0 END) as RecommendedReplenish
/* Wrong, does not account for balance resetting to zero */
from TX
) T order by TDate
如果它低于零,我需要找到一种方法将运行总计(又名 RT)重置为零。
我的查询中,Qty 和 RT 均为负数,并将其中较大的(负数较小的)作为第一次推荐的补充。这第一次可以正常工作。
我不知道如何从窗口运行总数中扣除这个。如果可能的话,我想在一个语句中做到这一点。
这是我正在寻找的输出的摘要:
TDate Qty R.Tot Replenish New RT
----------- ---- ----- ----------- ---------
3/1/2014 20 20 20
3/2/2014 -10 10 10
3/3/2014 -20 -10 10 0
3/4/2014 -10 -20 10 0
3/5/2014 30 10 30
3/6/2014 -20 -10 10
3/7/2014 10 0 20
3/8/2014 -20 -20 0
3/9/2014 - 5 -25 5 0
Itzik Ben-Gan、Joe Celko 或其他 SQL 英雄,你在吗? :)
提前致谢!
【问题讨论】:
-
使用
UPDATE和局部变量stackoverflow.com/questions/45729452/…检查以下优雅的解决方案
标签: sql sql-server tsql sql-server-2012