原文:在论坛中出现的比较难的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. Flutter -------- dio网络请求

    dio是Flutter中文网开源的一个强大的Dart Http请求库,支持Restful API.FormData.拦截器.请求取消.Cookie管理.文件上传/下载.超时等... 1.添加依赖# d ...

  2. 【Python】使用POST方式抓取有道翻译结果

    1.安装requests库 2.打开有道翻译,按下F12,进入开发者模式,输入我爱青青,点击Network,再点击XHR 3.撰写爬虫 import requestsimport json # 使用有 ...

  3. Linux记录-批量安装ssh(转载)

    首先,需要检查expect是否安装:rpm -qa|grep expect 然后,在操作机上创建公钥:ssh-keygen 一路回车即可 创建好之后到/root/.ssh/下就可以看到id开头的2个文 ...

  4. pycharm远程SSH调用服务器python解释器教程

    该教程主要介绍pycharm远程SSH调用解释器以及建立SFTP文件传输协议: 第一步:建立SSH连接: 第二步:建立SFTP协议: (1)SSH: 配置远程python解释器 这里主要讲的是如何配置 ...

  5. go micro rpc 直接调用 返回500 错误

    开启网关时需要 加上 flags micro api -handle=api --enable_rpc

  6. [ kvm ] 学习笔记 2:虚拟化基础

    1. 虚拟化概念 什么是虚拟化 虚拟化是使用所谓虚拟机管理程序从一台物理机上创建若干个虚拟机的过程.虚拟机的行为和运转方式与物理机一样,但它们会使用物理机的计算资源,如 CPU .内存和存储.虚拟机管 ...

  7. SpringCloud学习笔记:服务支撑组件

    SpringCloud学习笔记:服务支撑组件 服务支撑组件 在微服务的演进过程中,为了最大化利用微服务的优势,保障系统的高可用性,需要通过一些服务支撑组件来协助服务间有效的协作.各个服务支撑组件的原理 ...

  8. ipad 如何 Airplay 到 Windows 上?

    最近刚好有用到这个,觉得还不错,就推荐给大家.虽然个人并不喜欢苹果这一套,但是工作里难免掺杂一些会用到的ipad , mac . 纯粹技术分享. 1. 5KPlayer : https://www.5 ...

  9. 【C/C++开发】字符串操作

    1)字符串操作 strcpy(p, p1) 复制字符串  strncpy(p, p1, n) 复制指定长度字符串  strcat(p, p1) 附加字符串  strncat(p, p1, n) 附加指 ...

  10. SELinux安全子系统的学习

    SELinux(Security-Enhanced Linux)是美国国家安全局在 Linux 开源社区的帮助下开发的 一个强制访问控制(MAC,Mandatory Access Control)的安 ...