我的桌子后面跟着
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
答案 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;
?
用于指定行顺序的列。