sql查询语句实现两列相减循环求差的算法解决方法
sql查询语句实现两列相减循环求差的算法
id name nl nl1 cha
1 a 5 0 5
2 a 4 2 7
3 a 1 8 0
1 b 2 0 2
2 b 2 1 3
现在要求出cha这一列的数值,也就是nl-nl1,但是第二列name等于a的这个差就是(5+4)-(2+0)以此类推,但是不知道name字段具体有几例,可以是三列也可以是两列或者5列 等不确定的,这个需要怎么实现 大神求救啊
------解决思路----------------------
------解决思路----------------------
SQL 2012+可以用开窗函数
------解决思路----------------------
id name nl nl1 cha
1 a 5 0 5
2 a 4 2 7
3 a 1 8 0
1 b 2 0 2
2 b 2 1 3
现在要求出cha这一列的数值,也就是nl-nl1,但是第二列name等于a的这个差就是(5+4)-(2+0)以此类推,但是不知道name字段具体有几例,可以是三列也可以是两列或者5列 等不确定的,这个需要怎么实现 大神求救啊
------解决思路----------------------
--查询
;WITH CTE AS(
SELECT id,name,nl,nl1
,nl-nl1 cha
FROM TB
WHERE id=1
UNION ALL
SELECT T1.id,T1.name,T1.nl,T1.nl1
,T2.cha+T1.nl-T1.nl1
FROM TB T1
JOIN CTE T2 ON T1.name=T2.name AND T1.id=T2.id+1
)
SELECT * FROM CTE
ORDER BY name,id
--更新
;WITH CTE AS(
SELECT id,name,nl,nl1
,nl-nl1 cha
FROM TB
WHERE id=1
UNION ALL
SELECT T1.id,T1.name,T1.nl,T1.nl1
,T2.cha+T1.nl-T1.nl1
FROM TB T1
JOIN CTE T2 ON T1.name=T2.name AND T1.id=T2.id+1
)
UPDATE T1
SET cha=T2.cha
FROM TB T1
JOIN CTE T2 ON T1.name=T2.name AND T1.id=T2.id
------解决思路----------------------
SQL 2012+可以用开窗函数
------解决思路----------------------
declare @tab table(id int,name varchar(30), nl int,nl1 int)
insert into @tab
select 1, 'a', 5, 0 union all
select 2, 'a', 4, 2 union all
select 3, 'a', 1, 8 union all
select 1, 'b', 2, 0 union all
select 2, 'b', 2, 1
; with sel
as(select id,name,nl,nl1,nl-nl1 as cha from @tab where id=1
union all
select a.id,a.name,a.nl,a.nl1,b.cha+a.nl-a.nl1
from @tab a
join sel b on a.id=b.id+1 and a.name=b.name
)
select * from sel
order by name,id