在论坛中出现的比较难的sql问题:32(row_number函数+子查询 sql循环取差值)

原文: 在论坛中出现的比较难的sql问题:32(row_number函数+子查询 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的循环,查出的数据又该怎么保存呢?急用,多谢指教了!!!


下面是我的解法:


  
  
  1. --drop table tb
  2. create TABLE tb ( ID int, Num int,NumOut int)
  3. INSERT into tb
  4. SELECT 1, 4, 0 UNION ALL
  5. SELECT 2, 5, 0 UNION ALL
  6. SELECT 3, 8, 0 UNION ALL
  7. SELECT 4, 6, 0
  8. go
  9. --你要减的数
  10. declare @ num int
  11. set @ num = 10
  12. ;with t
  13. as
  14. (
  15. select *,
  16. row_number() over( order by @@servername) as rownum
  17. from tb
  18. ),
  19. tt
  20. as
  21. (
  22. select id,
  23. num,
  24. numout,
  25. ( select sum( num) from t t2
  26. where t2.rownum <= t1.rownum) as sum_num
  27. from t t1
  28. )
  29. --更新
  30. update tt
  31. set numout = case when sum_num <= @ num
  32. then num
  33. when sum_num > @ num and
  34. @ num - (sum_num - num) >= 0
  35. then @ num - (sum_num - num)
  36. else 0
  37. end
  38. --查询
  39. select * from tb
  40. /*
  41. ID Num NumOut
  42. 1 4 4
  43. 2 5 5
  44. 3 8 1
  45. 4 6 0
  46. */

猜你喜欢

转载自www.cnblogs.com/lonelyxmas/p/12020062.html
今日推荐