原文:在论坛中出现的比较难的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. */

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

  1. 在论坛中出现的比较难的sql问题:31(row_number函数+子查询 月环比计算)

    原文:在论坛中出现的比较难的sql问题:31(row_number函数+子查询 月环比计算) 所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路.

  2. 在论坛中出现的比较难的sql问题:4(row_number函数+子查询 分组连续编号问题)

    原文:在论坛中出现的比较难的sql问题:4(row_number函数+子查询 分组连续编号问题) 所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路. 求一查询语句 http: ...

  3. 在论坛中出现的比较难的sql问题:2(row_number函数+子查询)

    原文:在论坛中出现的比较难的sql问题:2(row_number函数+子查询) 2.如何去掉字段内的重复.

  4. 在论坛中出现的比较难的sql问题:46(日期条件出现的奇怪问题)

    原文:在论坛中出现的比较难的sql问题:46(日期条件出现的奇怪问题) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了. 所以,觉得有 ...

  5. 在论坛中出现的比较难的sql问题:45(用户在线登陆时间的小时、分钟计算问题)

    原文:在论坛中出现的比较难的sql问题:45(用户在线登陆时间的小时.分钟计算问题) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了. ...

  6. 在论坛中出现的比较难的sql问题:44(触发器专题 明细表插入数据时调用主表对应的数据)

    原文:在论坛中出现的比较难的sql问题:44(触发器专题 明细表插入数据时调用主表对应的数据) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决 ...

  7. 在论坛中出现的比较难的sql问题:42(动态行转列 考勤时间动态列)

    原文:在论坛中出现的比较难的sql问题:42(动态行转列 考勤时间动态列) 所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路.

  8. 在论坛中出现的比较难的sql问题:41(循环替换 循环替换关键字)

    原文:在论坛中出现的比较难的sql问题:41(循环替换 循环替换关键字) 所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路.

  9. 在论坛中出现的比较难的sql问题:40(子查询 销售和历史库存)

    原文:在论坛中出现的比较难的sql问题:40(子查询 销售和历史库存) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了. 所以,觉得有 ...

随机推荐

  1. python socketpool:通用连接池(转)

    简介 在软件开发中经常要管理各种“连接”资源,通常我们会使用对应的连接池来管理,比如mysql数据库连接可以用sqlalchemy中的池来管理,thrift连接可以通过thriftpool管理,red ...

  2. sanity checking

    https://zh.wikipedia.org/wiki/健全性测试 Modules\_threadmodule.c /* Lock objects */ typedef struct { PyOb ...

  3. Visio 的键盘快捷方式

    https://support.office.com/zh-cn/article/Visio-的键盘快捷方式-ee952f31-7e3e-4564-8116-f3ecbb733cc1 https:// ...

  4. Flutter AspectRatio、Card 卡片组件

    Flutter AspectRatio 组件 AspectRatio 的作用是根据设置调整子元素 child 的宽高比. AspectRatio 首先会在布局限制条件允许的范围内尽可能的扩展,widg ...

  5. Error:java: Compilation failed: internal java compiler

    errorInformation:java: javacTask: 源发行版 1.8 需要目标发行版 1.8 解决此类问题 检查自己的JDK是否一致 1  setting--------built  ...

  6. Spring MVC初始化

      整个Spring MVC的初始化,配置了DispatcherServlet和ContextLoaderListener,那么它们是如何初始化Spring IoC容器上下文和映射请求上下文的呢?所以 ...

  7. 实现Modbus TCP多网段客户端应用

    对于Modbus TCP来说与Modbus RTU和Modbus ASCII有比较大的区别,因为它是运行于以太网链路之上,是运行于TCP/IP协议之上的一种应用层协议.在协议栈的前两个版本中,Modb ...

  8. ip地址分类和网段详解

    IP地址分类/IP地址10开头和172开头和192开头的区别/判断是否同一网段 简单来说在公司或企业内部看到的就基本都是内网IP,ABC三类IP地址里的常见IP段. 每个IP地址都包含两部分,即网络号 ...

  9. linux用户解锁

    pam_tally2 --user=username  #查看 pam_tally2 --user=username --reset #重置

  10. 常见问题:MySQL/索引

    普通索引 最常用,没有任何限制. 唯一索引 必须唯一,但允许空值,如果是组合索引,列值的组合必须唯一. 组合索引 由于MySQL查询时,只能使用一个索引,因此建立组合索引在组合查询的场景下更加有效.组 ...