所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路。
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
- */
在论坛中出现的比较难的sql问题:32(row_number函数+子查询 sql循环取差值)
原文:https://www.cnblogs.com/lonelyxmas/p/12020062.html