做图表统计你需要掌握SQL Server 行转列和列转行
说在前面
做一个数据统计和分析的项目,每天面对着各种数据,经过存储过程从源表计算汇总后需要写入中间结果表以提高数据使用效率,那么此时就需要用到行转列和列转行。
1、列转行
数据经过计算加工后会直接生成前端图表需要的数据源,但是程序里又需要把该数据经过列转行写入中间表中,下次再查询该数据时直接从中间表查询数据。
1.1 列换行语法
table_source UNPIVOT( value_column FOR pivot_column IN(<column_list>) )
1.2 列转行案例
WITH T
AS
(
SELECT 1 as TeamId,'测试团队1' as Team,80 'MEN',20 'WOMEN'
UNION
SELECT 2 as TeamId,'测试团队2' as Team,30 'MEN',70 'WOMEN'
) ---列转行------------------------------------
SELECT TeamId,Team ,TYPE=ATTRIBUTE,CNT=VALUE
FROM T
UNPIVOT (
VALUE FOR ATTRIBUTE IN ([MEN],[WOMEN])
) AS UPV

2、 行转列
行转列主要是从中间表里查询数据,SQL SERVER2005以下的版本则可以使用聚合函数来完成。
2.1 行转列语法
table_source PIVOT( 聚合函数(value_column) FOR pivot_column IN(<column_list>) )
2.2、使用PIVOT实现
WITH T
AS
(
SELECT 1 AS ID,'测试团队1' TEAM,'MEN' ITEM,80 CENT
UNION
SELECT 1 AS ID,'测试团队1' TEAM,'WOMEN' ITEM,20 CENT
UNION
SELECT 2 AS ID,'测试团队2' TEAM,'MEN' ITEM,30 CENT
UNION
SELECT 2 AS ID,'测试团队2' TEAM,'WOMEN' ITEM,70 CENT
) SELECT * FROM T PIVOT (SUM(CENT) FOR ITEM IN ([MEN],[WOMEN])) A
2.3、使用聚合函数实现
WITH T
AS
(
SELECT 1 AS ID,'测试团队1' TEAM,'MEN' ITEM,80 CENT
UNION
SELECT 1 AS ID,'测试团队1' TEAM,'WOMEN' ITEM,20 CENT
UNION
SELECT 2 AS ID,'测试团队2' TEAM,'MEN' ITEM,30 CENT
UNION
SELECT 2 AS ID,'测试团队2' TEAM,'WOMEN' ITEM,70 CENT
) SELECT ID,TEAM,
SUM(CASE WHEN ITEM='MEN' THEN CENT ELSE 0 END) 'MEN',
SUM(CASE WHEN ITEM='WOMEN' THEN CENT ELSE 0 END) 'WOMEN'
FROM T
GROUP BY ID,TEAM
参考资料
http://www.cnblogs.com/zhangzt/archive/2010/07/29/1787825.html
http://www.cnblogs.com/aspnethot/articles/1762665.html
做图表统计你需要掌握SQL Server 行转列和列转行的更多相关文章
- SQL Server如何在变长列上存储索引
这篇文章我想谈下SQL Server如何在变长列上存储索引.首先我们创建一个包含变长列的表,在上面定义主键,即在上面定义了聚集索引,然后往里面插入80000条记录: -- Create a new t ...
- 浅析SQL Server数据库中的伪列以及伪列的含义
SQL Server中的伪列 下午看QQ群有人在讨论(非聚集)索引的存储,说,对于聚集索引表,非聚集索引存储的是索引键值+聚集索引键值:对于非聚集索引表,索引存储的是索引键值+RowId,这应该是一个 ...
- SQL Server缺省约束、列约束和表约束
SQL Server缺省约束是SQL Server数据库中的一种约束,下面就为您介绍SQL Server缺省约束.列约束和表约束的定义方法啊,供您参考. SQL Server缺省约束 SQL Serv ...
- SQL Server中Id自增列的最大Id是多少
什么是自增列 在SQL Server中可以将Id列设为自增.即无需为Id指定值,由SQL Server自动给该列赋值,每新增一列Id的值加一,初始值为1. 需要注意的是即使将原先添加的所有数据都删除, ...
- SQL Server 2016新特性:列存储索引新特性
SQL Server 2016新特性:列存储索引新特性 行存储表可以有一个可更新的列存储索引,之前非聚集的列存储索引是只读的. 非聚集的列存储索引支持筛选条件. 在内存优化表中可以有一个列存储索引,可 ...
- SQL Server查询时添加一列连续的自增列
SQL Server查询时添加一列连续的自增列 在SQL Server数据库中表信息会用到Identity关键字来设置自增列.但是当有数据被删除的话,自增列就不连续了.如果想查询出这个表的信息,并添加 ...
- Sql Server中判断表、列不存在则创建的方法[转]
一.Sql Server中如何判断表中某列是否存在 首先跟大家分享Sql Server中判断表中某列是否存在的两个方法,方法示例如下: 比如说要判断表A中的字段C是否存在两个方法: 第一种方法 ? ...
- 关于SQL Server数据库中的标识列
一.标识列的定义以及特点 SQL Server中的标识列又称标识符列,习惯上又叫自增列. 该种列具有以下三种特点: 1.列的数据类型为不带小数的数值类型 2.在进行插入(Insert)操作时,该列的值 ...
- SQL Server 行转列重温
转载自http://www.cnblogs.com/kerrycode/ 行转列,列转行是我们在开发过程中经常碰到的问题.行转列一般通过CASE WHEN 语句来实现,也可以通过 SQL SERVER ...
随机推荐
- Android控件之Notification
Android通知就是让设备在屏幕最顶上那栏里面显示图标,当滑下通知栏之后可以看到列表状的通知选项,有些是"通知"类型的,有些是"正在运行"类型的," ...
- git中https和SSH
1.在git中clone项目有两种方式:HTTPS和SSH,它们的区别如下: HTTPS:不管是谁,拿到url随便clone,但是在push的时候需要验证用户名和密码: SSH:clone的项目你必须 ...
- webserver几个例子
刚刚学习了web服务,实现了发布和调用电话号码归属地查询,下面我简单的说一下 第一个方法利用网页实现号码查询: 首先进入http://www.webxml.com.cn/网站 然后点这个 输入手机号码 ...
- DRY(Don't Repeat Yourself )原则
凡是写过一些代码的程序猿都能够意识到应该避免重复的代码和逻辑.我们通过提取方法,提取抽象类等等措施来达到这一目的.我们总能时不时的听到类似这样的话:”把这些公用的类放到shared项目去,别的项目还要 ...
- Python黑帽编程2.3 字符串、列表、元组、字典和集合
Python黑帽编程2.3 字符串.列表.元组.字典和集合 本节要介绍的是Python里面常用的几种数据结构.通常情况下,声明一个变量只保存一个值是远远不够的,我们需要将一组或多组数据进行存储.查询 ...
- 使用 SailingEase WinForm 框架构建复合式应用程序(插件式应用程序)
对于一些较小的项目,具备一定经验的开发人员应该能够设计和构建出便于进行维护和扩展的应用程序.但是,随着功能模块数量(以及开发维护这些部件的人员)的不断增加,对项目实施控制的难度开始呈指数级增长. Sa ...
- IEEE754、VAX、IBM浮点型介绍和.NET中互相转换
[题外话] 最近在做C3D文件的解析,好奇怪的是文件中竟然存储了CPU的类型,原本不以为然,结果后来读取一个文件发现浮点数全部读取错误.查了下发现虽然在上世纪80年代就提出了IEEE754要统一浮点数 ...
- 可以这样去理解group by和聚合函数
写在前面的话:用了好久group by,今天早上一觉醒来,突然感觉group by好陌生,总有个筋别不过来,为什么不能够select * from Table group by id,为什么一定不能是 ...
- Oracle客户端连接远程Oracle服务中文乱码问题
在本机远程连接远程Oracle服务的时候,写了如下检索语句 select * from sys_employee 结果集中出现了中文乱码,但是远程服务器本身的PL/SQL检索出来没有问题 解决方案: ...
- 蓄水池(Reservoir_sampling)抽样算法简记
摘要 1.适用场合 2.算法简介 3.代码例子 4.Spark RangePartitioner 中的应用(待补充) 内容 1.适用场合:从包含n个项目的集合S中选取k个样本,其中n为一很大或未知的数 ...