更新第二行的总和值

时间:2018-11-12 08:32:06

标签: sql sql-server

我的桌子后面跟着

User Col1 Col2 
ABC   35   75
ABC   500  75

我需要选择查询以获取以下输出。

User Col1 Col2 Result
ABC   35   75    40
ABC   500  75    115

Check col1<col2 then Result Col2-Col1
else
Col2 + Result(Row1)

Ex:
35<75 then 40
else
75+40

我不知道如何开始,请帮助我们进行输出。

预先感谢

我尝试过的

Select User,Col1,Col2
,Case When Col1<Col2 then Col2-Col1 Else Col2 End as Result

然后我得到了类似的输出,

User Col1 Col2 Result
ABC  35   75    40
ABC  500  75    **75**

我需要115而不是第二行结果中的75

5 个答案:

答案 0 :(得分:2)

CREATE  TABLE #tmp
(
    UserName VARCHAR(10),
    col1 INT,
    col2 INT  
)

INSERT INTO #tmp (UserName, col1, col2)
          SELECT 'ABC',   35,   75
UNION ALL SELECT 'ABC',   500,  75

SELECT tmp.UserName
      ,tmp.col1
      ,tmp.col2
      ,CASE WHEN tmp.Result = 0 THEN tmp.col2 + LAG(tmp.Result) OVER (ORDER BY (SELECT NULL)) ELSE tmp.Result END  AS Result
FROM
(
Select UserName,Col1,Col2
,Case When Col1<Col2 then Col2-Col1 Else 0 End as Result
FROM #tmp
)tmp

答案 1 :(得分:0)

您可以尝试这样的事情:

SELECT *
,Case When Col1 < Col2 then Col2-Col1 
  Else (Col2 + LAG(Col2-Col1 ,1) OVER(ORDER BY Col2)) --Order by
 End as Result
FROM TableName

通过使用LAG,您可以访问上一行数据。然后,我要做的就是将先前的结果添加到Col2值中。

Else (Col2 + LAG(Col2-Col1 ,1) OVER(ORDER BY Col2))
  

下面的重要说明。

这里唯一需要注意的是ORDER BY Col2。目前,这仅适用于两行数据。但是,如果您有更多信息,则应添加某种自动递增ID字段,以使顺序与输入数据的顺序相同。然后,将其更改为ORDER BY ID

答案 2 :(得分:0)

您可以在下面使用lag()函数尝试

 Select User,Col1,Col2
   ,Case When Col1<Col2 then Col2-Col1 
    Else Col2+lag(col2-col1) over(partition by user order by col2 ) End as Result
 from tablename

答案 3 :(得分:0)

您需要为此使用LAG功能。这是代码...如果您喜欢答案,请投票。

Select *
   ,Case When Col1<Col2 then Col2-Col1 
    Else Col2+lag(col2-col1) over(partition by user order by col2 ) End as Result
 from review

答案 4 :(得分:0)

首先,您需要一列来表示行的顺序。

如果我将问题概括化,那么您需要由col1 < col2定义的组。您可以通过累积col1 < col2的总和来定义组。

然后,实际计算是该组的累计总和:

select t.*,
       (case when col1 < col2 then col2 - col1
             else sum(case when col1 > col2 then col2 - col1 else col2 end) over (partition by user, grp order by ?)
        end) as result
from (select t.*,
             sum(case when col1 < col2 then 1 else 0 end) over (partition by user order by ?) as grp
      from t
     ) t            
from t;

?用于指定行顺序的列。