Sql 从列中的上一个值减去当前行中其他值的差值
下午好!我想得到以下结果:减去必须发货的差额的剩余部分。我尝试使用滞后函数。事实证明,但不知何故,一切都是扭曲的。告诉我如何用SQL更优雅地编写它Sql 从列中的上一个值减去当前行中其他值的差值,sql,lag,difference,Sql,Lag,Difference,下午好!我想得到以下结果:减去必须发货的差额的剩余部分。我尝试使用滞后函数。事实证明,但不知何故,一切都是扭曲的。告诉我如何用SQL更优雅地编写它 CREATE TABLE TestTable( [id] INT IDENTITY, [productid] INT, [name] NVARCHAR(256), [ordered] DECIMAL(6,3), [delivered] DECIMAL(6,3), [remainder] DECIMAL(6,3)); INSERT INTO Test
CREATE TABLE TestTable(
[id] INT IDENTITY,
[productid] INT,
[name] NVARCHAR(256),
[ordered] DECIMAL(6,3),
[delivered] DECIMAL(6,3),
[remainder] DECIMAL(6,3));
INSERT INTO TestTable ([productid], [name], [ordered], [delivered], [remainder])
VALUES (712054, 'Product OSFNS', 253, 246.005, 13.255),
(712054, 'Product OSFNS', 186, 183.63, 13.255),
(712054, 'Product OSFNS', 196.8, 193.745, 13.255),
(712054, 'Product OSFNS', 480, 477.025, 13.255)
以及查询:
WITH CTE_diff AS
(SELECT
T1.[id]
,T1.[productid]
,T1.[name]
,T1.[ordered]
,T1.[delivered]
,T1.[remainder]
,LAG(T2.[ordered] - T2.[delivered], 1, T1.[ordered] - T1.[delivered])
OVER (ORDER BY T2.[productid]) as R
FROM TestTable T1 JOIN TestTable T2
ON T1.id = T2.id - 1
UNION
SELECT *
FROM (
SELECT TOP(1)
T1.[id]
,T1.[productid]
,T1.[name]
,T1.[ordered]
,T1.[delivered]
,T1.[remainder]
,LEAD(T2.[ordered] - T2.[delivered], 1, T1.[ordered] - T1.[delivered])
OVER (ORDER BY T2.[productid]) as R
FROM TestTable T1 JOIN TestTable T2
ON T1.id = T2.id
ORDER BY T1.id DESC
) as tbl)
SELECT * FROM CTE_diff;
我的最佳猜测是,您需要累计金额:
select tt.*,
remainder + sum(delivered - ordered) over (partition by productid order by id) as net_amount
from testtable tt;
是一个数字小提琴。我最好的猜测是你想要累积的总和:
select tt.*,
remainder + sum(delivered - ordered) over (partition by productid order by id) as net_amount
from testtable tt;
是一把小提琴。我迷路了。作为文本表的示例数据和所需结果很有帮助(db或sql FIDLE也是如此)。电子表格中的公式引用了未显示的单元格。我迷路了。作为文本表的示例数据和所需结果很有帮助(db或sql FIDLE也是如此)。电子表格中的公式引用了未显示的单元格。下午好!我需要的不是一个总数,而是一个差额而不是一个总数!那些在第一次迭代中,结果应该是:R=剩余-(已订购-已交付),在剩余的R=上一个R-(已订购-已交付(当前行))。这是基于这个原则@MrJack0209。我修正了逻辑,加了一把小提琴。下午好!我需要的不是一个总数,而是一个差额而不是一个总数!那些在第一次迭代中,结果应该是:R=剩余-(已订购-已交付),在剩余的R=上一个R-(已订购-已交付(当前行))。这是基于这个原则@MrJack0209。我修正了逻辑,加了一把小提琴。