最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了。
所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路。
sql循环取差值,该怎么写?
http://bbs.csdn.net/topics/390636438?page=1#post-396012416
现在有一组 条件 和 一个 数字(比如是10)
根据条件可以查出若干条数据 ,比如是这么样子的
ID Num NumOut
1 4 0
2 5 0
3 8 0
4 6 0……
按顺序 用每一条记录的 Num减去 数字,够减NumOut赋值为差值,不够减,NumOut赋值与Num相同,再用下一个减剩余数量。
也就是说,以上的数据会被更新为:
ID Num NumOut
1 4 4
2 5 5
3 8 1
4 6 0……
这应该如何用sql语句表达???
按我的想法应该写个循环,判断的,但从来没写过sql的循环,查出的数据又该怎么保存呢?急用,多谢指教了!!!
下面是我的解法:
--drop table tb
create TABLE tb (ID int,Num int,NumOut int)
INSERT into tb
SELECT 1,4,0 UNION ALL
SELECT 2,5,0 UNION ALL
SELECT 3,8,0 UNION ALL
SELECT 4,6,0
go
--你要减的数
declare @num int
set @num = 10
;with t
as
(
select *,
row_number() over(order by @@servername) as rownum
from tb
),
tt
as
(
select id,
num,
numout,
(select sum(num) from t t2
where t2.rownum <= t1.rownum) as sum_num
from t t1
)
--更新
update tt
set numout = case when sum_num <= @num
then num
when sum_num > @num and
@num - (sum_num - num) >=0
then @num - (sum_num - num)
else 0
end
--查询
select * from tb
/*
ID Num NumOut
1 4 4
2 5 5
3 8 1
4 6 0
*/