首页 > 解决方案 > 增加一列的值

问题描述

我想创建一个 CTE 或从值中减去已知值的东西sum()

我该如何解决这个问题,我尝试LAG()在我的 CTE 上使用,但是当我的值为负时它会出错。

这就是我试图做的:

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

标签: sqlsql-server

解决方案


只是猜测...

;WITH  cte as (
select
       PR
       ,Plafond
       ,RATA 
    ,ROW_NUMBER() OVER (PARTITION by PR  ORDER BY PR) as cont
from #table
)

SELECT  
*
, case when Plafond - SUM (Rata) OVER ( partition by PR  order by CONT) < 0 then 0 else Plafond - SUM (Rata) OVER ( partition by PR  order by CONT) end AS result
, case 
    when Plafond - SUM (Rata) OVER ( partition by PR  order by CONT) >= 0 then rata
    else iif (rata > abs(Plafond - SUM (Rata) OVER ( partition by PR  order by CONT)), rata-abs(Plafond - SUM (Rata) OVER ( partition by PR  order by CONT)), 0)
        --case when rata > abs(Plafond - SUM (Rata) OVER ( partition by PR  order by CONT)) then rata-abs(Plafond - SUM (Rata) OVER ( partition by PR  order by CONT))
        --else 0
        --end
    end as ratanew
FROM cte;



;WITH  cte as (
select
       PR
       ,Plafond
       ,RATA 
    ,ROW_NUMBER() OVER (PARTITION by PR  ORDER BY PR) as cont
from #table
)

SELECT  
*
, case when Plafond - SUM (Rata) OVER ( partition by PR  order by CONT) < 0 then 0 else Plafond - SUM (Rata) OVER ( partition by PR  order by CONT) end AS result
FROM cte;

推荐阅读