【发布时间】:2020-02-04 14:31:11
【问题描述】:
我想创建一个 CTE 或从 sum() 的值中减去已知值的东西。
我该如何解决这个问题,我尝试在我的 CTE 上使用 LAG(),但是当我的值为负时它会出错。
这是我尝试做的:
DROP TABLE IF EXISTS #table;
CREATE table #table (
PR Varchar(50),
Rata int ,
Plafond int
)
insert into #table
select 'PR1',3,10
Union
SELECT 'PR1',4,10
Union
SELECT 'PR1',6,10
Union
SELECT 'PR1',5,10
Union
SELECT 'PR2',5,10
;WITH cte as (
select
PR
,Plafond
,RATA
,ROW_NUMBER() OVER (PARTITION by PR ORDER BY PR) as cont
from #table
)
SELECT
*
, Plafond - SUM (Rata) OVER ( partition by PR,cont order by PR) AS result
FROM cte
这是查询的结果
PR Plafond RATA cont result
PR1 10 3 1 7
PR1 10 4 2 6
PR1 10 5 3 5
PR1 10 6 4 4
PR2 10 5 1 5
这是我对查询逻辑的期望,但这不是我想要的最终结果:
PR Plafond RATA cont Result
PR1 10 3 1 7
PR1 10 4 2 3
PR1 10 5 3 -2
PR1 10 6 4 -8
PR2 10 5 1 5
这是(最终结果)我期望得到的结果,应用 WHERE 子句或其他东西,当我的“结果”为负时转换“Rata”。 “Rata”的新值成为上一个“Result”和零值之间的差值,在这种情况下,“Rata”=5(cont=3)的值变为 3。残基“Result”和“Rata”之间的差值使新的“结果”为 0。
PR Plafond RATA cont Result
PR1 10 3 1 7
PR1 10 4 2 3
PR1 10 3 3 0
PR1 10 0 4 0
PR2 10 5 1 5
【问题讨论】:
-
查询结果和您发布的数据与您所说的不符。
-
预期结果是哪一个?
-
你能解释一下逻辑吗?我实在看不出来。
标签: sql sql-server