一  例题

例题用表:[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提高篇(变量的使用 拓展)的更多相关文章

  1. SQL 提高查询效率

    1.关于SQL查询效率,100w数据,查询只要1秒,与您分享: 机器情况p4: 2.4内存: 1 Gos: windows 2003数据库: ms sql server 2000目的: 查询性能测试, ...

  2. Java提高篇(二八)------TreeSet

    与HashSet是基于HashMap实现一样,TreeSet同样是基于TreeMap实现的.在<Java提高篇(二七)-----TreeMap>中LZ详细讲解了TreeMap实现机制,如果 ...

  3. java提高篇之详解内部类

    可以将一个类的定义放在另一个类的定义内部,这就是内部类. 内部类是一个非常有用的特性但又比较难理解使用的特性(鄙人到现在都没有怎么使用过内部类,对内部类也只是略知一二). 第一次见面 内部类我们从外面 ...

  4. [转载] 我的WafBypass之道(SQL注入篇)

    我的WafBypass之道(SQL注入篇) Web安全 作者:先知技术社区   2016-11-23  7,566   [本文转自安全脉搏战略合作伙伴先知技术社区 原帖地址  安全脉搏编辑huan97 ...

  5. Java提高篇——对象克隆(复制)

    假如说你想复制一个简单变量.很简单: int apples = 5; int pears = apples; 不仅仅是int类型,其它七种原始数据类型(boolean,char,byte,short, ...

  6. SQL Server数据库性能优化之SQL语句篇【转】

    SQL Server数据库性能优化之SQL语句篇http://www.blogjava.net/allen-zhe/archive/2010/07/23/326927.html 近期项目需要, 做了一 ...

  7. SQL Server 表变量和临时表的区别

    SQL Server 表变量和临时表的区别 一.表变量 表变量在SQL Server 2000中首次被引入.表变量的具体定义包括列定义,列名,数据类型和约束.而在表变量中可以使用的约束包括主键约束,唯 ...

  8. java提高篇(三十)-----Iterator

    迭代对于我们搞Java的来说绝对不陌生.我们常常使用JDK提供的迭代接口进行Java集合的迭代. Iterator iterator = list.iterator(); while(iterator ...

  9. java提高篇(二九)-----Vector

    在java提高篇(二一)-–ArrayList.java提高篇(二二)-LinkedList,详细讲解了ArrayList.linkedList的原理和实现过程,对于List接口这里还介绍一个它的实现 ...

随机推荐

  1. Unity碰撞器触发关系测试

    本文刚体有关的内容不再赘述,主要测试碰撞器和触发器的消息关系. 刚体在这篇有测试:U3D刚体测试1-刚体非刚体物体非Kinematic等之间的碰撞关系 碰撞器测试结果: 1.A对象为Collider, ...

  2. SPOJ 375. Query on a tree (树链剖分)

    Query on a tree Time Limit: 5000ms Memory Limit: 262144KB   This problem will be judged on SPOJ. Ori ...

  3. Java线程锁一个简单Lock

    /** * @author * * Lock 是java.util.concurrent.locks下提供的java线程锁,作用跟synchronized类似, * 单是比它更加面向对象,两个线程执行 ...

  4. [问题2015S01] 复旦高等代数 II(14级)每周一题(第二教学周)

    [问题2015S01]  设 \(M_n(\mathbb{R})\) 是 \(n\) 阶实方阵全体构成的实线性空间, \(\varphi\) 是 \(M_n(\mathbb{R})\) 上的线性变换, ...

  5. 原来MySQl就是这样工作的!

    一.MySQL简单介绍     MySQL是当今最流行的开源数据库管理系统,超过10亿的下载量足可以证明这点.MySQL以其速度.高可靠性.简单易用,广泛应用,一些大型企业也在逐渐应用,如:Faceb ...

  6. Python virtualenv安装库报错SSL: CERTIFICATE_VERIFY_FAILED

    Python virtualenv安装库报错SSL: CERTIFICATE_VERIFY_FAILED 问题描述 使用pip按照virtualenv报错,如下: pip install virtua ...

  7. 微信小程序文件结构

    在小程序的跟目录有三个文件 app.js   小程序逻辑   必须有app.json 小程序公共设置  必须有app.wxss 小程序公共样式表  非必须有 小程序的每个页面是一个文件夹 里面包含4种 ...

  8. 下载SRA文件

    sratoolkit.2.6.2-centos_linux64/bin/prefetch  下载SRA文件 fastq-dump    --split-3    SRR2923014.sra    转 ...

  9. android DevicePolicyManager实现一键锁屏

    本文章一部分资料来源于网上 1.实现一键锁屏关键是DevicePolicyManager这个类,然后使用lockNow():方法. 2.DevicePolicyManager类,可以让你的做软件获得系 ...

  10. js之oop <四>对象管理

    对象扩展管理 Object.isExtensible() 检测对象是否可扩展(一般返回true).Object.preventExtensions() 防止对象扩展. var p = {p1:&quo ...