18、SQL提高篇(变量的使用 拓展)
一 例题
例题用表:[cost]
注:费用类型个数不定
将上图所示的表根据type列的类型转为下图样式
*用变量将类型名分组动态提取的方法:
declare @sql1 varchar(1000)
set @sql1=''
select @sql1= case @sql1 when '' then '' else @sql1+',' end +ltrim(str([type])) from cost group by [type]
select @sql1
查询的结果如下:
解法:
1、普通变量查询法:
--通过语句拼接实现--
1)声明变量
declare @sql nvarchar(max)
declare @sqlsumcol nvarchar(max)
declare @sqlcol nvarchar(max)
set @sqlsumcol = ''
set @sqlcol = ''
2)先查询出一个以"[类型x单价],[类型x用量],[类型x总价]"为列名的虚拟表结果集
select @sqlcol = case @sqlcol when '' then '' else @sqlcol + ',' end
+ 'case when [type]=' + LTrim(Rtrim(STR([type]))) + ' then [price] else 0 end as [类型' + LTrim(Rtrim(STR([type]))) + '单价], '
+ 'case when [type]=' + LTrim(Rtrim(STR([type]))) + ' then [num] else 0 end as [类型' + LTrim(Rtrim(STR([type]))) + '用量], '
+ 'case when [type]=' + LTrim(Rtrim(STR([type]))) + ' then [all_price] else 0 end as [类型' + LTrim(Rtrim(STR([type]))) + '总价]'
from [cost] group by [type]
3)根据列名来进行分组求sum值等(因为单价不能求总和,所以用max来代替sum)
select @sqlsumcol = case @sqlsumcol when '' then '' else @sqlsumcol + ', ' end
+ 'max([类型' + LTrim(Rtrim(STR([type]))) + '单价]) as [单价], '
+ 'sum([类型' + LTrim(Rtrim(STR([type]))) + '用量]) as [用量], '
+ 'sum([类型' + LTrim(Rtrim(STR([type]))) + '总价]) as [总价]'
from [cost] group by [type]
4)进行字符串拼接查询出总计以外的行
set @sql = '(select str([uid]) as [用户id], ' + @sqlsumcol + ' from
(select ' + Rtrim(@sqlcol) + ', [uid] from [cost] c inner join [user] u on c.[uid] = u.[id]) a
group by [uid])'
拼接上总计所需要的行
+'union (select ''总计'', ' + @sqlsumcol + ' from
(select ' + Rtrim(@sqlcol) + ', [uid] from [cost] c inner join [user] u on c.[uid] = u.[id]) a
)'
5)执行 exec(@sql)
2、2005以后的版本可以用PIVOT/UNPIVOT方法,即为行列倒置。
二、简单的例子:
select N'任务编号',missionid from MissionPool
union
select N'总和',SUM(case when MissionId=0 then 0 else missionid end) as id from MissionPool
这可以查询一列的数据,还有它的总和
18、SQL提高篇(变量的使用 拓展)的更多相关文章
- SQL 提高查询效率
1.关于SQL查询效率,100w数据,查询只要1秒,与您分享: 机器情况p4: 2.4内存: 1 Gos: windows 2003数据库: ms sql server 2000目的: 查询性能测试, ...
- Java提高篇(二八)------TreeSet
与HashSet是基于HashMap实现一样,TreeSet同样是基于TreeMap实现的.在<Java提高篇(二七)-----TreeMap>中LZ详细讲解了TreeMap实现机制,如果 ...
- java提高篇之详解内部类
可以将一个类的定义放在另一个类的定义内部,这就是内部类. 内部类是一个非常有用的特性但又比较难理解使用的特性(鄙人到现在都没有怎么使用过内部类,对内部类也只是略知一二). 第一次见面 内部类我们从外面 ...
- [转载] 我的WafBypass之道(SQL注入篇)
我的WafBypass之道(SQL注入篇) Web安全 作者:先知技术社区 2016-11-23 7,566 [本文转自安全脉搏战略合作伙伴先知技术社区 原帖地址 安全脉搏编辑huan97 ...
- Java提高篇——对象克隆(复制)
假如说你想复制一个简单变量.很简单: int apples = 5; int pears = apples; 不仅仅是int类型,其它七种原始数据类型(boolean,char,byte,short, ...
- SQL Server数据库性能优化之SQL语句篇【转】
SQL Server数据库性能优化之SQL语句篇http://www.blogjava.net/allen-zhe/archive/2010/07/23/326927.html 近期项目需要, 做了一 ...
- SQL Server 表变量和临时表的区别
SQL Server 表变量和临时表的区别 一.表变量 表变量在SQL Server 2000中首次被引入.表变量的具体定义包括列定义,列名,数据类型和约束.而在表变量中可以使用的约束包括主键约束,唯 ...
- java提高篇(三十)-----Iterator
迭代对于我们搞Java的来说绝对不陌生.我们常常使用JDK提供的迭代接口进行Java集合的迭代. Iterator iterator = list.iterator(); while(iterator ...
- java提高篇(二九)-----Vector
在java提高篇(二一)-–ArrayList.java提高篇(二二)-LinkedList,详细讲解了ArrayList.linkedList的原理和实现过程,对于List接口这里还介绍一个它的实现 ...
随机推荐
- python字符串加颜色区别
1.有时需要显目的区别不同内容,可以改变显目的内容颜色 print("\033[31;1m你好麽,\033[0m我很好..")print("\033[32;1m你好麽,\ ...
- python(七)字符串格式化、生成器与迭代器
字符串格式化 Python的字符串格式化有两种方式:百分号方式.format方式 1.百分号的方式 %[(name)][flags][width].[precision]typecode (name) ...
- HTML学习开篇
最近开的博客,一切都是从零开始,昨天刚写了java的开篇,今天写一写HTML开篇. 很多初学者都不太看重前端的学习,甚至鄙视前端,我刚开始时就这样.其实,要想成为一个真正的程序员,前端和后端都必须了解 ...
- python学习总结1
1.python环境搭建 1.下载python并安装,下载地址:http://pan.baidu.com/s/1jHpWblk 2.启动idle即可编辑python代码 2.基本语法 1.注释:单行注 ...
- sqlAlchemy 按DateTime字段的年或月进行group_by查询
一.根据”create_date“查询每天的数据 1.查询2016年5月每天的数据 session.query(extract('day', User.create_date).label('day' ...
- 软件测试--测试Demo
视频地址(第二课时):https://pan.baidu.com/s/1gfLVC2n 软件安装好了! 软件默认的浏览器是火狐. 如果需要IE,chrome,都在前一篇的安装包里有. 测试结果 视频里 ...
- USACO2011Brownie Slicing巧克力蛋糕切片
Description Bessie烘焙了一块巧克力蛋糕.这块蛋糕是由R*C(1 <= R,C <= 500)个小的巧克力蛋糕组成的. 第i行,第j列的蛋糕有N_ij(1 < ...
- html中button自动提交表单?
在ie中,button默认的type是button,而其他浏览器和W3C标准中button默认的属性都是submit
- laravel 表单验证 正则匹配
判断url地址 是否为正确格式 控制器中 $this -> validate($request,[ 'linkname' => 'required|max:6|min:2', 'url' ...
- win7文件夹共享(不新建账户、不带密码直接访问)
1.右键需要共享的文件夹>共享>特定用户>选择Everyone>“添加”>“共享” 2.打开控制面板>按类别的查看方式>网络和Internet下的选择家庭组和 ...