原文:在论坛中出现的比较难的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. Windows7 64位配置ODBC数据源(Sybase)的方法

    Windows7 64位配置ODBC数据源(Sybase)的方法 操作步骤: 1,通过“控制面板->ODBC(32位)”进入ODBC数据源管理器,如下图: 假如没找到“ODBC(32位)”,则可 ...

  2. Linux命令 – ln 软连接与硬链接区别介绍

    ln命令可以生成软链接和硬链接,也可叫做符号链接和实体链接. 有兴趣深入理解的可以查阅相关文档,一般的读者只需记住以下几点即可: 不管是软链接还是硬链接都不会额外增加磁盘空间(虽然实际情况可能会多占用 ...

  3. Python3基础 变量命名 区分大小写

             Python : 3.7.3          OS : Ubuntu 18.04.2 LTS         IDE : pycharm-community-2019.1.3    ...

  4. 查看所使用的Linux系统是32位还是64 位的方法

    方法一:getconf LONG_BIT # getconf LONG_BIT 1 1 我的Linux是32位!!! 方法二:arch # arch 1 1 显示 i686 就是32位,显示 x86_ ...

  5. 通过直方图进行PCA准备

    import graphviz import mglearn from mpl_toolkits.mplot3d import Axes3D from sklearn.datasets import ...

  6. matlab基本函数find

    一起来学演化计算-matlab基本函数find 觉得有用的话,欢迎一起讨论相互学习~Follow Me 找到非零元素的索引和值 语法 k = find(X) k = find(X)返回一个向量,其中包 ...

  7. 转:HR schema

    ###createe RemRem $Header: hr_cre.sql 29-aug-2002.11:44:03 hyeh Exp $RemRem hr_cre.sqlRemRem Copyrig ...

  8. Flink 实现指定时长或消息条数的触发器

    Flink 中窗口是很重要的一个功能,而窗口又经常配合触发器一起使用. Flink 自带的触发器大概有: CountTrigger: 指定条数触发 ContinuousEventTimeTrigger ...

  9. 机器学习中的数学-线性判别分析(LDA)

    前言在之前的一篇博客机器学习中的数学(7)——PCA的数学原理中深入讲解了,PCA的数学原理.谈到PCA就不得不谈LDA,他们就像是一对孪生兄弟,总是被人们放在一起学习,比较.这这篇博客中我们就来谈谈 ...

  10. DataTable.NET 使用server-side processing

    https://datatables.net/examples/server_side/simple.html 當頁面上要顯示的數據在10萬筆以上時,可以使用server-side processin ...