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


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

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

求一SQL语句。

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


  1. create table #tab
  2. (
  3. col1 char(10),
  4. col2 char(10),
  5. item char(10),
  6. num int,
  7. [Date] varchar(10))
  8. insert #tab values('AAA','BBB','A',50,'2013-06-10')
  9. insert #tab values('ABB','BGG','B',30,'2013-06-10')
  10. insert #tab values('AAA','BBB','C',80,'2013-06-13')

我的解法:


  1. create table tab
  2. (
  3. col1 char(10),
  4. col2 char(10),
  5. item char(10),
  6. num int,
  7. [Date] varchar(10)
  8. )
  9. insert tab values('AAA','BBB','A',50,'2013-06-10')
  10. insert tab values('ABB','BGG','B',30,'2013-06-10')
  11. insert tab values('AAA','BBB','C',80,'2013-06-13')
  12. --动态生成sql语句
  13. declare @start_date varchar(10) = '2013-06-01',
  14. @end_date varchar(10) = '2013-06-30';
  15. declare @date varchar(10),
  16. @sql varchar(max) = '',
  17. @sql1 varchar(8000),
  18. @sql2 varchar(8000);
  19. set @date = @start_date;
  20. set @sql1 = 'select case when rownum = 1 then col1 else '''' end as col1,
  21. case when rownum = 1 then col2 else '''' end as col2,
  22. item'
  23. set @sql2 = 'select col1,col2,item,row_number() over(partition by col1,col2
  24. order by item) as rownum'
  25. while @date <= @end_date
  26. begin
  27. set @sql1 = @sql1 + ',v_' + REPLACE( right(@date,5),'-','') +
  28. ' as ''' + CAST(DATEPART(month,@date) as varchar) + '/' +
  29. CAST(DATEPART(day,@date) as varchar) +'''';
  30. set @sql2 = @sql2 + ',SUM(case when date =''' + @date +
  31. ''' then num else 0 end) as v_' +
  32. REPLACE( right(@date,5),'-','')
  33. set @date = CONVERT(varchar(10),dateadd(day,1,@date),120)
  34. end
  35. set @sql = @sql1 + ' from (' +
  36. @sql2 + ' from tab
  37. group by col1,col2,item' +
  38. ') v'
  39. --生产的动态sql语句
  40. select @sql
  41. exec(@sql)

上面由于是动态生成语句,所以不能用局部的临时表,所以建了一个表。

下面是动态生成的sql语句,经过了格式化:


  1. select case when rownum = 1 then col1 else '' end as col1,
  2. case when rownum = 1 then col2 else '' end as col2,
  3. item,
  4. v_0601 as '6/1',v_0602 as '6/2',v_0603 as '6/3',
  5. v_0604 as '6/4',v_0605 as '6/5',
  6. v_0606 as '6/6',v_0607 as '6/7',
  7. v_0608 as '6/8',v_0609 as '6/9',
  8. v_0610 as '6/10',v_0611 as '6/11',
  9. v_0612 as '6/12',v_0613 as '6/13',
  10. v_0614 as '6/14',v_0615 as '6/15',
  11. v_0616 as '6/16',v_0617 as '6/17',
  12. v_0618 as '6/18',v_0619 as '6/19',
  13. v_0620 as '6/20',v_0621 as '6/21',
  14. v_0622 as '6/22',v_0623 as '6/23',
  15. v_0624 as '6/24',v_0625 as '6/25',
  16. v_0626 as '6/26',v_0627 as '6/27',
  17. v_0628 as '6/28',v_0629 as '6/29',
  18. v_0630 as '6/30'
  19. from
  20. (
  21. select col1,col2,item,
  22. row_number() over(partition by col1,col2 order by item) as rownum,
  23. SUM(case when date ='2013-06-01' then num else 0 end) as v_0601,
  24. SUM(case when date ='2013-06-02' then num else 0 end) as v_0602,
  25. SUM(case when date ='2013-06-03' then num else 0 end) as v_0603,
  26. SUM(case when date ='2013-06-04' then num else 0 end) as v_0604,
  27. SUM(case when date ='2013-06-05' then num else 0 end) as v_0605,
  28. SUM(case when date ='2013-06-06' then num else 0 end) as v_0606,
  29. SUM(case when date ='2013-06-07' then num else 0 end) as v_0607,
  30. SUM(case when date ='2013-06-08' then num else 0 end) as v_0608,
  31. SUM(case when date ='2013-06-09' then num else 0 end) as v_0609,
  32. SUM(case when date ='2013-06-10' then num else 0 end) as v_0610,
  33. SUM(case when date ='2013-06-11' then num else 0 end) as v_0611,
  34. SUM(case when date ='2013-06-12' then num else 0 end) as v_0612,
  35. SUM(case when date ='2013-06-13' then num else 0 end) as v_0613,
  36. SUM(case when date ='2013-06-14' then num else 0 end) as v_0614,
  37. SUM(case when date ='2013-06-15' then num else 0 end) as v_0615,
  38. SUM(case when date ='2013-06-16' then num else 0 end) as v_0616,
  39. SUM(case when date ='2013-06-17' then num else 0 end) as v_0617,
  40. SUM(case when date ='2013-06-18' then num else 0 end) as v_0618,
  41. SUM(case when date ='2013-06-19' then num else 0 end) as v_0619,
  42. SUM(case when date ='2013-06-20' then num else 0 end) as v_0620,
  43. SUM(case when date ='2013-06-21' then num else 0 end) as v_0621,
  44. SUM(case when date ='2013-06-22' then num else 0 end) as v_0622,
  45. SUM(case when date ='2013-06-23' then num else 0 end) as v_0623,
  46. SUM(case when date ='2013-06-24' then num else 0 end) as v_0624,
  47. SUM(case when date ='2013-06-25' then num else 0 end) as v_0625,
  48. SUM(case when date ='2013-06-26' then num else 0 end) as v_0626,
  49. SUM(case when date ='2013-06-27' then num else 0 end) as v_0627,
  50. SUM(case when date ='2013-06-28' then num else 0 end) as v_0628,
  51. SUM(case when date ='2013-06-29' then num else 0 end) as v_0629,
  52. SUM(case when date ='2013-06-30' then num else 0 end) as v_0630
  53. from tab
  54. group by col1,col2,item
  55. ) v

发布了416 篇原创文章 · 获赞 135 · 访问量 95万+

在论坛中出现的比较难的sql问题:39(动态行转列 动态日期列问题)的更多相关文章

  1. 在论坛中出现的比较难的sql问题:29(row_number函数 组内某列的值连续出现3次标记出来)

    原文:在论坛中出现的比较难的sql问题:29(row_number函数 组内某列的值连续出现3次标记出来) 在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘 ...

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. Java 并发基础常见面试题总结

    1. 什么是线程和进程? 1.1. 何为进程? 进程是程序的一次执行过程,是系统运行程序的基本单位,因此进程是动态的.系统运行一个程序即是一个进程从创建,运行到消亡的过程. 在 Java 中,当我们启 ...

  2. Spring中好玩的注解和接口

    测试中: 一.unit中集中基本注解,是必须掌握的. @BeforeClass – 表示在类中的任意public static void方法执行之前执行 @AfterClass – 表示在类中的任意p ...

  3. ES6深入浅出-9 Promise-1.回调与回调地狱

    promise 回调 把fun的调用写在另外一个函数里 fun()的调用在fn2这个函数里面.也是调用了函数.这种函数的调用形式叫做回调. A打电话给C找B.但是B不在,C说等B在的时候让B给A回电话 ...

  4. Spring cloud微服务安全实战-3-2 第一个API及注入攻击防护

    先来写一些用户的基础数据的管理的api.就是用户的基本的增删改查.用spring boot可以很容易的写出这种api 首先新建maven的项目 依赖关系 引入依赖.用最新的spring boot ht ...

  5. [整理]Python程序员面试前需要看的博客(持续整理)

    基本素养 如何聪明的提问 面试方法 从面试官角度来告诉大家,哪些人能面试成功 如何在面试中介绍自己的项目经验 计算机系统 [面试] 迄今为止把同步/异步/阻塞/非阻塞/BIO/NIO/AIO讲的这么清 ...

  6. iOS实现简单时钟效果

    实现的效果图如下 : 实现代码如下: #import "ViewController.h" //将旋转角度转换为弧度制#define angleToRadion(angle) (( ...

  7. hdu 2018 母牛的故事 动态规划入门题

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2018 设 f[i][j] 表示第i天年龄为j的母牛个数,其中j=4代表所有年龄达到4岁的成年母牛,则: ...

  8. ubuntu 18.04下载mysql8.0.13源码并编译安装(暂时没有成功)

    执行如下命令下载解压MySQL8的源码文件压缩包到本地文件: wget https://cdn.mysql.com//Downloads/MySQL-8.0/mysql-boost-8.0.13.ta ...

  9. DevOps - DevOps精要 - 溯源

    1 - DevOps的含义 DevOps涉及领域广泛,其含义因人而异,在不同的理解和需求场景下,有着不同的实践形式. DevOps可以理解为是一个职位.一套工具集合.一组过程与方法.一种组织形式与文化 ...

  10. 【Tools】PDF编辑软件-pdfelement 6.8 官网文件中文+破解版本

    试用了下,感觉还不错分享给大家. 有币的求赏,小弟下载缺币.没币的从附件下载. 赏币地址:https://download.csdn.net/download/qq_18187161/10744059 ...