【问题标题】:Increase the value of a column增加一列的值
【发布时间】: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


【解决方案1】:

只是猜测...

;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;

【讨论】:

  • 我正要发布一个相同的猜测。
  • 感谢 Iprt,这是正确的,但是当结果变为 0 时,列“Rata”(您可以创建一个新列以在 Rata 列上进行逻辑)可以更改吗?
  • 非常感谢 Iptr
猜你喜欢
  • 2022-01-20
  • 1970-01-01
  • 1970-01-01
  • 2015-10-10
  • 1970-01-01
  • 2018-02-18
  • 2016-04-29
  • 1970-01-01
  • 2013-07-25
相关资源
最近更新 更多