原文:在论坛中出现的比较难的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. 替换分隔符 ^p, 或者是回车

    1  Excel 里面的数据, 粘出来到notepad上,再从notepad 粘到word, 再把world里面的分隔符或者是回车符替换成 其他的 .

  2. mount: unknown filesystem type ‘ntfs’ 解决方法

    问题: mount –t ntfs /dev/sde1 /mnt/mount: unknown filesystem type ‘ntfs’ 这是由于CentOS release 6.6(Final) ...

  3. git pull There is no tracking information for the current branch.

    在高版本的 git下面,也许会看见这样的提示: 解决方案:指定当前工作目录工作分支,跟远程的仓库,分支之间的链接关系. 比如我们设置master对应远程仓库的master分支 git branch - ...

  4. openresty开发系列18--lua的字符串string操作

    openresty开发系列18--lua的字符串string操作 string的相关操作 1)string.upper(s)接收一个字符串 s,返回一个把所有小写字母变成大写字母的字符串.print( ...

  5. jenkins下载插件Git Parameter插件

    登陆jekinse -> 点击左边菜单列表 -> 点”系统管理“ -> 下拉点”插件管理“ -> 选“可选插件”,在右上角过滤框输入”Git Parameter” -> ...

  6. python设计模式第2版

    python设计模式第2版 目录 第1章 设计模式简介 1 1.1 理解面向对象编程 1 1.1.1 对象 2 1.1.2 类 2 1.1.3 方法 2 1.2 面向对象编程的主要概念 3 1.2.1 ...

  7. OpenGL程序无法启动此应用程序,因为计算机中丢失glut32.dll(转))

    今天打开一个OpenGL源码,各种修改之后想要运行看一下效果,结果在我的开发环境下出现缺少相应的dll库: Windows7 64位+VS2010 提示:程序无法启动此应用程序,因为计算机中丢失glu ...

  8. 一个命令永久禁用Win10驱动程序强制签名

    https://blog.csdn.net/xiaodingqq/article/details/80093888

  9. 原生JavaScript常用本地浏览器存储方法二(cookie)

    JavsScript Cookie概述 cookie是浏览器提供的一种机制,它将document对象的cookie属性提供给JavaScript.可以由JavaScript对其进行控制,而并不是Jav ...

  10. vue-cli3 按需加载loading,服务的方式调用

    安装 babel-plugin-component npm install babel-plugin-component -S 安装element-ui npm install element-ui ...