原文:在论坛中出现的比较难的sql问题:19(row_number函数 行转列、sql语句记流水)


最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了。

所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路。

1、SQLServer 把表的挨着的四条数据合并到一起

http://bbs.csdn.net/topics/390735343

数据:

a          a         

 b          b         

 c          c         

 d          d         

 e          e         

 f          f         

 g          g         

 h          h         

 i              i

我的方法:


  1. --drop table t
  2. create table t(name varchar(10),pass varchar(10))
  3. insert into t
  4. select 'a', 'a' union all
  5. select 'b', 'b' union all
  6. select 'c', 'c' union all
  7. select 'd', 'd' union all
  8. select 'e', 'e' union all
  9. select 'f', 'f' union all
  10. select 'g', 'g' union all
  11. select 'h', 'h' union all
  12. select 'i', 'i'
  13. go
  14. select MAX(case when rn = 1 then name else null end) name,
  15. MAX(case when rn = 1 then pass else null end) pass,
  16. MAX(case when rn = 2 then name else null end) name,
  17. MAX(case when rn = 2 then pass else null end) pass,
  18. MAX(case when rn = 3 then name else null end) name,
  19. MAX(case when rn = 3 then pass else null end) pass,
  20. MAX(case when rn = 4 then name else null end) name,
  21. MAX(case when rn = 4 then pass else null end) pass
  22. from
  23. (
  24. select *,
  25. ROW_NUMBER() over(partition by rownum order by getdate()) rn
  26. from
  27. (
  28. select *,
  29. (ROW_NUMBER() over(order by getdate())-1) / 4 rownum
  30. from t
  31. )t
  32. )t
  33. group by rownum
  34. /*
  35. name pass name pass name pass name pass
  36. a a b b c c d d
  37. e e f f g g h h
  38. i i NULL NULL NULL NULL NULL NULL
  39. */

2、怎么用简单的sql语句记流水?

http://bbs.csdn.net/topics/390674508

有一个流水表TF,字段有ID,FirstQuantity,ChangeQuantity,FinalQuantity。ID表示物品,后面几个表示期初数量,变化数量,最终数量。

假设表TF现在是空

有一张变动表TC,字段有ID,Quantity。表示某物品的数量。里面会有重复。内容如下:

ID Quantity

1  10

1  20

1  30

那么当我把TC的数据加入到TF后,TF的内容应该如下:


  1. ID FirstQuantity ChangeQuantity FinalQuantity
  2. 1 0 10 10
  3. 1 10 20 30
  4. 1 30 30 60

这个功能,用编程的方法很好解决,就是一个一个循环写入,但是效率太慢了。

那么能不能用一条sql语句就搞定呢?

我的方法:


  1. create table tc(ID int, Quantity int)
  2. insert into tc
  3. select 1 ,10 union all
  4. select 1 ,20 union all
  5. select 1 ,30
  6. go
  7. ;with t
  8. as
  9. (
  10. select *,
  11. ROW_NUMBER() over(partition by id order by @@servername) rownum
  12. from tc
  13. )
  14. select ID,
  15. FirstQuantity,
  16. ChangeQuantity,
  17. FirstQuantity+ChangeQuantity as inalQuantity
  18. from
  19. (
  20. select ID,
  21. case when rownum = 1 then 0
  22. else (select SUM(Quantity) from t t2
  23. where t2.ID = t1.id and t2.rownum < t1.rownum)
  24. end as FirstQuantity,
  25. Quantity as ChangeQuantity
  26. from t t1
  27. )tt
  28. /*
  29. ID FirstQuantity ChangeQuantity inalQuantity
  30. 1 0 10 10
  31. 1 10 20 30
  32. 1 30 30 60
  33. */
发布了416 篇原创文章 · 获赞 135 · 访问量 94万+

在论坛中出现的比较难的sql问题:19(row_number函数 行转列、sql语句记流水)的更多相关文章

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

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

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

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

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

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

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

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

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

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

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

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

  7. 在论坛中出现的比较难的sql问题:39(动态行转列 动态日期列问题)

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

  8. 在论坛中出现的比较难的sql问题:38(字符拆分 字符串检索问题)

    原文:在论坛中出现的比较难的sql问题:38(字符拆分 字符串检索问题) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了. 所以,觉得 ...

  9. 在论坛中出现的比较难的sql问题:37(动态行转列 某一行数据转为列名)

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

随机推荐

  1. [String]两个右补空格使字符串达到固定长度的函数 来自网上 请君自取

    代码: package fixsizestring; public class TestClass { public static void main(String[] args) { for(int ...

  2. MySQL按日期分组并统计截止当前时间的总数(实例教程)

    MySQL按日期分组并统计截止当前时间的总数 建表语句 SET NAMES utf8mb4; ; -- ---------------------------- -- Table structure ...

  3. log4j 异常时在日志文件里面显示空的。

    如下图所示,输入的时候不要写 e.getStackTrace() 一般情况下不会出问题,但有时候就会出问题 解决方案

  4. Qt编写自定义控件60-声音波形图

    一.前言 这个控件源自于一个音乐播放器,在写该音乐播放器的时候,需要将音频的数据转换成对应的频谱显示,采用的fmod第三方库来处理(fmod声音系统是为游戏开发者准备的革命性音频引擎,非常强大和牛逼) ...

  5. 把github代码自动部署到服务器

    一.参考文献 https://developer.github.com/webhooks/ https://docs.gitlab.com/ee/user/project/integrations/w ...

  6. 软件测试成熟度模型TCMM (转载)

    下面我们就看看是如何划分的,来评判一下各位同仁自己所在的公司,所在的级别. TCMM Level 1:Initial(初始级)   测试处于一个混乱的状态,还不能把测试同调试分开,在编码完成后才进行测 ...

  7. golang实现无限级菜单(beego框架下)

    原文地址  http://www.niu12.com/article/37 golang实现无限级菜单(beego框架下) 数据表如下 -- ---------------------------- ...

  8. C# Hook原理及EasyHook

    C# Hook原理及EasyHook简易教程 前言 在说C# Hook之前,我们先来说说什么是Hook技术.相信大家都接触过外挂,不管是修改游戏客户端的也好,盗取密码的也罢,它们都是如何实现的呢? 实 ...

  9. IDEA中的,让光标回到上一次停留的地方

    IDEA中的,光标返回到上一次停留的地方ctrl+alt+ ←IDEA中的,光标返回到下一次停留的地方ctrl+alt+ → 不过要小心,笔记本电脑,默认的翻转屏幕的快捷键和这个冲突..我的选择是关闭 ...

  10. Django之用户注册

    用户注册需要提交的信息包括: 用户名 邮箱 密码 确认密码 验证码 这里选择form表单提交信息,注册页面的响应函数就要分条件执行,get请求时要展示注册页面,post请求时要接收用户提交的信息,对信 ...