原文:在论坛中出现的比较难的sql问题:15(生成动态删除列语句 分组内多行转为多列)

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


1、如果去掉这个临时表中合计为0 的字段

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

我有一个临时表 ##temp,

字段 

住院号,床位,应收金额,优惠金额1,优惠金额2,优惠金额3,优惠金额4.。。。。优惠金额N

 我想把临时表中 优惠金额X 合计为0的字段去掉,如何去?

 又或者,生成另一个没有 优惠金额X 合计为0字段的临时表。

我的解法:


  1. -- drop table ##temp
  2. create table ##temp
  3. (
  4. 住院号 varchar(20),
  5. 床位 varchar(20),
  6. 应收金额 numeric(20,3),
  7. 优惠金额1 numeric(20,3),
  8. 优惠金额2 numeric(20,3),
  9. 优惠金额3 numeric(20,3),
  10. 优惠金额4 numeric(20,3)
  11. )
  12. insert into ##temp
  13. select '00000','111',1000, 0,0,0,10 union all
  14. select '00001','112',1000, 0 ,0,0,0 union all
  15. select '00002','113',1000, 0,0,0,0 union all
  16. select '00003','114',1000, 0 ,0,0,20 union all
  17. select '00004','115',1000, 0,2,0,3 union all
  18. select '00005','116',1000, 0,0,0,0 union all
  19. select '00006','117',1000, 0,0,0,0
  20. go
  21. declare @sql nvarchar(max);
  22. declare @sql_delete_column nvarchar(max);
  23. declare @tb table(column_name nvarchar(100),rownum int)
  24. declare @count int;
  25. declare @i int;
  26. declare @return int;
  27. declare @temp_name nvarchar(100);
  28. declare @del_column nvarchar(100);
  29. set @sql = '';
  30. set @sql_delete_column = '';
  31. --临时表名
  32. set @temp_name = '##temp'
  33. --需要删除的列名
  34. set @del_column = '%优惠金额%';
  35. insert into @tb
  36. select --t.name,
  37. c.name as column_name,
  38. row_number() over(order by @@servername) as rownum
  39. --c.column_id
  40. from tempdb.sys.tables t
  41. inner join tempdb.sys.columns c
  42. on t.object_id = c.object_id
  43. where t.name = @temp_name
  44. and c.name like @del_column;
  45. set @count = (select count(*) from @tb);
  46. set @i = 1;
  47. while @i <= @count
  48. begin
  49. set @sql = 'select @return=sum('+
  50. (select column_name from @tb where rownum = @i) +
  51. ') from ' + @temp_name;
  52. exec sp_executesql @sql,N'@return int output',@return output;
  53. select @sql_delete_column =
  54. @sql_delete_column +
  55. case when @return <> 0 then ' '
  56. else 'alter table '+@temp_name +
  57. ' drop column '+
  58. (select column_name from @tb where rownum = @i) +
  59. ';'
  60. end
  61. set @i = @i +1
  62. end
  63. --动态生成的删除列语句
  64. select @sql_delete_column
  65. /*
  66. (无列名)
  67. alter table ##temp drop column 优惠金额1;
  68. alter table ##temp drop column 优惠金额3;
  69. */
  70. --删除列
  71. exec(@sql_delete_column)
  72. --查询数据
  73. select * from ##temp;
  74. /*
  75. 住院号 床位 应收金额 优惠金额2 优惠金额4
  76. 00000 111 1000.000 0.000 10.000
  77. 00001 112 1000.000 0.000 0.000
  78. 00002 113 1000.000 0.000 0.000
  79. 00003 114 1000.000 0.000 20.000
  80. 00004 115 1000.000 2.000 3.000
  81. 00005 116 1000.000 0.000 0.000
  82. 00006 117 1000.000 0.000 0.000
  83. */

2、动态行转列

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

型号  年 月 日 准确率 缺到率 可用率

thd 2013 1 1  56   23    34

thd 2013 1 1  66   77    54

thd 2013 1 1  78   55    77

hhh 2012 9 18 89   55    23

hhn 2012 9 18 33   37    45

hhn 2012 9 18 67   56    12

上面的数据 怎样变成下面这样

即怎样将同一天同一型号的数据在一行显示
型号  年 月 日 准确率 缺到率 可用率 准确率 缺到率 可用率 准确率 缺到率 可用率

thd 2013 1 1  56   23    34    66   77    54     78   55    77

hhh 2012 9 18 89   55    23    33   37    45     67   56    12

我的解法:

  1. drop table tb
  2. go
  3. create table tb(
  4. 型号 varchar(20),年 int, 月 int, 日 int,
  5. 准确率 int, 缺到率 int,可用率 int
  6. )
  7. insert into tb
  8. select 'thd' ,2013, 1, 1 , 56 , 23 , 34
  9. union all select 'thd', 2013 ,1 ,1 ,66 ,77 ,54
  10. union all select 'thd', 2013 ,1 ,1 ,78 ,55 ,77
  11. union all select 'hhh', 2012 ,9 ,18 ,89 ,55 ,23
  12. union all select 'hhh', 2012 ,9 ,18 ,33 ,37 ,45
  13. union all select 'hhh', 2012 ,9 ,18 ,67 ,56 ,12
  14. go
  15. declare @sql nvarchar(max);
  16. set @sql = '';
  17. ;with t
  18. as
  19. (
  20. select *,
  21. ROW_NUMBER() over(partition by 型号,年,月,日 order by @@servername) as rownum
  22. from tb
  23. )
  24. select
  25. @sql = @sql + ',max(case when rownum = '+cast(rownum as varchar)+' then 准确率 else null end) as 准确率' +
  26. ',max(case when rownum = '+cast(rownum as varchar)+' then 缺到率 else null end) as 缺到率' +
  27. ',max(case when rownum = '+cast(rownum as varchar)+' then 可用率 else null end) as 可用率'
  28. from t
  29. group by rownum
  30. select @sql = 'select 型号,年,月,日' + @sql +
  31. ' from (select *,
  32. ROW_NUMBER() over(partition by 型号,年,月,日 order by @@servername) as rownum
  33. from tb)t' +
  34. ' group by 型号,年,月,日'
  35. --select @sql
  36. exec(@sql)
  37. /*
  38. 型号 年 月 日 准确率 缺到率 可用率 准确率 缺到率 可用率 准确率 缺到率 可用率
  39. hhh 2012 9 18 89 55 23 33 37 45 67 56 12
  40. thd 2013 1 1 56 23 34 66 77 54 78 55 77
  41. */

在论坛中出现的比较难的sql问题:15(生成动态删除列语句 分组内多行转为多列)的更多相关文章

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

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

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

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

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

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

  4. 在论坛中出现的比较难的sql问题:36(动态行转列 解析json格式字符串)

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

  5. 在论坛中出现的比较难的sql问题:26(动态行专列+合并字符串、补足行数)

    原文:在论坛中出现的比较难的sql问题:26(动态行专列+合并字符串.补足行数) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了. 所 ...

  6. 在论坛中出现的比较难的sql问题:6(动态行转列 考试科目、排名动态列问题)

    原文:在论坛中出现的比较难的sql问题:6(动态行转列 考试科目.排名动态列问题) 所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路. 下面的几个问题,都是动态行转列的问题. ...

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

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

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

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

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

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

随机推荐

  1. html访问图片资源403问题(http referrer)

    前言 之前碰到一个问题,就是html中通过img标签引入一个图片地址,报403.但是这个图片地址直接复制出来在地址栏打开,却是看得到的.     先说下解决方法: 在HTML代码的head中添加一句& ...

  2. IPFS系列 多节点搭建 二

    IPFS系列 多节点搭建 二 上一篇介绍了IPFS的分布式点对点超媒体传输协议的背景和安装介绍,本篇将继续指导搭建多节点的IPFS私有网络 文件服务.如果没还没开始搭建IPFS节点的小伙伴, 请戳此链 ...

  3. Andorid SQLite数据库开发基础教程(2)

    Andorid SQLite数据库开发基础教程(2) 数据库生成方式 数据库的生成有两种方式,一种是使用数据库管理工具生成的数据库,我们将此类数据库称为预设数据库,另一种是使用代码生成的数据库.

  4. 算法习题---5-2Ducci序列(UVa1594)

    一:题目 对于一个n元组(a1, a2, …, an),可以对于每个数求出它和下一个数的差的绝对值,得到一个新的n元组(|a1-a2|, |a2-a3|, …, |an-a1|).重复这个过程,得到的 ...

  5. VMware 快速克隆出多个 Linux centos7 环境

    这样一台系统就已经克隆好了,但是,现在还没有完,因为是克隆的,里面的ip地址和创建的主机名都是一样,需要进行修改 登录服务器,然后使用 [ifcfg-ens33需根据实际情况而定] vi /etc/s ...

  6. 123457123456#0#-----com.cym.shuXue02--前拼后广--开心学数学

    com.cym.shuXue02--前拼后广--开心学数学

  7. Go并发编程实战 第2版 PDF (中文版带书签)

    Go并发编程实战 第2版 目录 第1章 初识Go语言 1 1.1 语言特性 1 1.2 安装和设置 2 1.3 工程结构 3 1.3.1 工作区 3 1.3.2 GOPATH 4 1.3.3 源码文件 ...

  8. array_map array_walk

    $config = [ => [], => [], => [] ]; array_map(function($key) use ($config){ print_r($key); d ...

  9. iOS-UIDocumentInteractionController打开和预览文档

    iOS提供了使用其他app预览文件的支持,这就是Document Interaction Controller.此外,iOS也支持文件关联,允许其他程序调用你的app打开某种文件.而且,从4.2开始, ...

  10. The underlying connection was closed: The connection was closed unexpectedly.

    基础连接已经关闭: 连接被意外关闭. 基础连接已经关闭: 发送时发生错误 防火墙问题.或是杀毒软件,卫士之类的.(360 卸载 )