在论坛中出现的比较难的sql问题:15(生成动态删除列语句 分组内多行转为多列)
原文:在论坛中出现的比较难的sql问题:15(生成动态删除列语句 分组内多行转为多列)
所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路。
1、如果去掉这个临时表中合计为0 的字段
http://bbs.csdn.net/topics/390625348
我有一个临时表 ##temp,
字段
住院号,床位,应收金额,优惠金额1,优惠金额2,优惠金额3,优惠金额4.。。。。优惠金额N
我想把临时表中 优惠金额X 合计为0的字段去掉,如何去?
又或者,生成另一个没有 优惠金额X 合计为0字段的临时表。
我的解法:
-
-- drop table ##temp
-
-
create table ##temp
-
(
-
住院号 varchar(20),
-
床位 varchar(20),
-
应收金额 numeric(20,3),
-
优惠金额1 numeric(20,3),
-
优惠金额2 numeric(20,3),
-
优惠金额3 numeric(20,3),
-
优惠金额4 numeric(20,3)
-
)
-
-
insert into ##temp
-
select '00000','111',1000, 0,0,0,10 union all
-
select '00001','112',1000, 0 ,0,0,0 union all
-
select '00002','113',1000, 0,0,0,0 union all
-
select '00003','114',1000, 0 ,0,0,20 union all
-
select '00004','115',1000, 0,2,0,3 union all
-
select '00005','116',1000, 0,0,0,0 union all
-
select '00006','117',1000, 0,0,0,0
-
-
go
-
-
declare @sql nvarchar(max);
-
declare @sql_delete_column nvarchar(max);
-
-
declare @tb table(column_name nvarchar(100),rownum int)
-
declare @count int;
-
declare @i int;
-
declare @return int;
-
-
declare @temp_name nvarchar(100);
-
declare @del_column nvarchar(100);
-
-
set @sql = '';
-
set @sql_delete_column = '';
-
-
--临时表名
-
set @temp_name = '##temp'
-
-
--需要删除的列名
-
set @del_column = '%优惠金额%';
-
-
-
insert into @tb
-
select --t.name,
-
c.name as column_name,
-
row_number() over(order by @@servername) as rownum
-
--c.column_id
-
from tempdb.sys.tables t
-
inner join tempdb.sys.columns c
-
on t.object_id = c.object_id
-
where t.name = @temp_name
-
and c.name like @del_column;
-
-
-
set @count = (select count(*) from @tb);
-
set @i = 1;
-
-
while @i <= @count
-
begin
-
set @sql = 'select @return=sum('+
-
(select column_name from @tb where rownum = @i) +
-
') from ' + @temp_name;
-
-
exec sp_executesql @sql,N'@return int output',@return output;
-
-
select @sql_delete_column =
-
@sql_delete_column +
-
case when @return <> 0 then ' '
-
else 'alter table '+@temp_name +
-
' drop column '+
-
(select column_name from @tb where rownum = @i) +
-
';'
-
end
-
set @i = @i +1
-
end
-
-
-
--动态生成的删除列语句
-
select @sql_delete_column
-
/*
-
(无列名)
-
alter table ##temp drop column 优惠金额1;
-
alter table ##temp drop column 优惠金额3;
-
*/
-
-
-
--删除列
-
exec(@sql_delete_column)
-
-
-
--查询数据
-
select * from ##temp;
-
/*
-
住院号 床位 应收金额 优惠金额2 优惠金额4
-
00000 111 1000.000 0.000 10.000
-
00001 112 1000.000 0.000 0.000
-
00002 113 1000.000 0.000 0.000
-
00003 114 1000.000 0.000 20.000
-
00004 115 1000.000 2.000 3.000
-
00005 116 1000.000 0.000 0.000
-
00006 117 1000.000 0.000 0.000
-
*/
2、动态行转列
型号 年 月 日 准确率 缺到率 可用率
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
-
drop table tb
-
go
-
-
create table tb(
-
型号 varchar(20),年 int, 月 int, 日 int,
-
准确率 int, 缺到率 int,可用率 int
-
)
-
-
insert into tb
-
select 'thd' ,2013, 1, 1 , 56 , 23 , 34
-
union all select 'thd', 2013 ,1 ,1 ,66 ,77 ,54
-
union all select 'thd', 2013 ,1 ,1 ,78 ,55 ,77
-
union all select 'hhh', 2012 ,9 ,18 ,89 ,55 ,23
-
union all select 'hhh', 2012 ,9 ,18 ,33 ,37 ,45
-
union all select 'hhh', 2012 ,9 ,18 ,67 ,56 ,12
-
go
-
-
-
declare @sql nvarchar(max);
-
-
set @sql = '';
-
-
;with t
-
as
-
(
-
select *,
-
ROW_NUMBER() over(partition by 型号,年,月,日 order by @@servername) as rownum
-
from tb
-
)
-
-
select
-
@sql = @sql + ',max(case when rownum = '+cast(rownum as varchar)+' then 准确率 else null end) as 准确率' +
-
',max(case when rownum = '+cast(rownum as varchar)+' then 缺到率 else null end) as 缺到率' +
-
',max(case when rownum = '+cast(rownum as varchar)+' then 可用率 else null end) as 可用率'
-
from t
-
group by rownum
-
-
-
select @sql = 'select 型号,年,月,日' + @sql +
-
' from (select *,
-
ROW_NUMBER() over(partition by 型号,年,月,日 order by @@servername) as rownum
-
from tb)t' +
-
' group by 型号,年,月,日'
-
-
--select @sql
-
-
exec(@sql)
-
/*
-
型号 年 月 日 准确率 缺到率 可用率 准确率 缺到率 可用率 准确率 缺到率 可用率
-
hhh 2012 9 18 89 55 23 33 37 45 67 56 12
-
thd 2013 1 1 56 23 34 66 77 54 78 55 77
-
*/
在论坛中出现的比较难的sql问题:15(生成动态删除列语句 分组内多行转为多列)的更多相关文章
- 在论坛中出现的比较难的sql问题:42(动态行转列 考勤时间动态列)
原文:在论坛中出现的比较难的sql问题:42(动态行转列 考勤时间动态列) 所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路.
- 在论坛中出现的比较难的sql问题:39(动态行转列 动态日期列问题)
原文:在论坛中出现的比较难的sql问题:39(动态行转列 动态日期列问题) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了. 所以,觉 ...
- 在论坛中出现的比较难的sql问题:37(动态行转列 某一行数据转为列名)
原文:在论坛中出现的比较难的sql问题:37(动态行转列 某一行数据转为列名) 所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路.
- 在论坛中出现的比较难的sql问题:36(动态行转列 解析json格式字符串)
原文:在论坛中出现的比较难的sql问题:36(动态行转列 解析json格式字符串) 所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路.
- 在论坛中出现的比较难的sql问题:26(动态行专列+合并字符串、补足行数)
原文:在论坛中出现的比较难的sql问题:26(动态行专列+合并字符串.补足行数) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了. 所 ...
- 在论坛中出现的比较难的sql问题:6(动态行转列 考试科目、排名动态列问题)
原文:在论坛中出现的比较难的sql问题:6(动态行转列 考试科目.排名动态列问题) 所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路. 下面的几个问题,都是动态行转列的问题. ...
- 在论坛中出现的比较难的sql问题:46(日期条件出现的奇怪问题)
原文:在论坛中出现的比较难的sql问题:46(日期条件出现的奇怪问题) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了. 所以,觉得有 ...
- 在论坛中出现的比较难的sql问题:45(用户在线登陆时间的小时、分钟计算问题)
原文:在论坛中出现的比较难的sql问题:45(用户在线登陆时间的小时.分钟计算问题) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了. ...
- 在论坛中出现的比较难的sql问题:44(触发器专题 明细表插入数据时调用主表对应的数据)
原文:在论坛中出现的比较难的sql问题:44(触发器专题 明细表插入数据时调用主表对应的数据) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决 ...
随机推荐
- Docs-.NET-C#-指南-语言参考-关键字-值类型-:浮点数值类型
ylbtech-Docs-.NET-C#-指南-语言参考-关键字-值类型-:浮点数值类型 1.返回顶部 1. 浮点数值类型(C# 引用) 2019/10/22 “浮点类型”是“简单类型”的子集,可以使 ...
- [转][osg]探究osg中的程序设计模式【目录】
作者:3wwang 原文接连:http://www.3wwang.cn/html/article_104.html 前序 探究osg中的程序设计模式---开篇 探究osg中的程序设计模式---创造性模 ...
- 一、搭建简单的axis web服务
转: 一.搭建简单的axis web服务 1.在官方网站下载axis的工程(这个等下就有用的)和源码.jar包等,下载地址是: http://labs.renren.com/apache-mirror ...
- linux非root用户安装4.0.14版本redis
先到官网https://redis.io/download下安装包,现在最新是5.0.5版本,可惜点击下载后被windows禁了,那就下4版本的,往下看Other versions的Old(4.0), ...
- hppts的理解
参考: https://www.ruanyifeng.com/blog/2014/02/ssl_tls.html
- 转:HR schema
###createe RemRem $Header: hr_cre.sql 29-aug-2002.11:44:03 hyeh Exp $RemRem hr_cre.sqlRemRem Copyrig ...
- response.getWriter().write的用法
/** * 获取手机验证码的方法 */ var loopObjBindMobil = null; var secondsBindMobil = 0; function hqBindYzm(moblie ...
- vue-cli4.0 基于 antd-design-vue 二次封装发布到 npm 仓库
1. 安装 cli npm install -g @vue/cli vue create winyh-ui 2.安装 antd-design-vue cnpm i ant-design-vue --s ...
- linux信号量例子
semaphore.h 提供的是 POSIX 标准定义的 semaphore 接口,而 sys/sem.h 里 提供的是符合 System V 标准的 semaphore接口 (semget, sem ...
- [ kvm ] 学习笔记 1:Linux 操作系统及虚拟化
1. 前言 一台计算机是由一堆硬件设备组合而成,在硬件之上是操作系统,操作系统与计算机硬件密不可分,操作系统用来管理所有的硬件资源提供服务,各个硬件设备是通过 总线 进行连接起来的: 在操作系统之上, ...