Pivot For和UNPivot For
一、使用PIVOT和UNPIVOT命令的SQL Server版本要求
1.数据库的最低版本要求为SQL Server 2005 或更高。
2.必须将数据库的兼容级别设置为90 或更高。
3.查看我的数据库版本及兼容级别。
如果不知道怎么看数据库版本或兼容级别的话可以在SQL Server Management Studio新建一个查询窗口输入:print @@version,运行之后在我的本机上得到:

然后我们选择一个数据库然后右键-属性 选择[选项]得到下图的信息。

二、使用PIVOT实现列转行
PIVOT语法:
SELECT <未透视的列>,
[第一个透视列] AS <列别名>,
[第二个透视列] AS <列别名>,
...
[最后一个透视列] AS <列别名>
FROM ( <SELECT查询>
) AS <源表>
PIVOT
( <聚合函数>(<列>)
FOR [<需要转换为行的列>]
IN ( [第一个透视列], [第二个透视列], ... [最后一个透视列] )
) AS <数据透视表> <可选的ORDER BY子句>;
创建临时表学生成绩表#T_Score,包括三个字段(学生姓名(Student_Name),科目(Class_Name),成绩(Score))
创建临时表的sql:
CREATE TABLE #T_Score
(
Student_Name VARCHAR(30),
Class_Name VARCHAR(30),
Score INT
)
向T_Score表中插入6条记录,筛选结果为:

1、要求,筛选出每个学生语文,数学,英语的成绩
SELECT Student_Name ,
语文 ,
数学 ,
英语
FROM #T_Score --这里是PIVOT第二步骤(准备原始的查询结果,因为PIVOT是对一个原始的查询结果集进行转换操作,所以先查询一个结果集出来)这里可以是一个select子查询,但为子查询时候要指定别名,否则语法错误
PIVOT ( SUM(Score) FOR Class_Name IN ( [语文], [英语], [数学] ) ) p
--思路:将Class_Name列值转换成列名,转换后的列值为分数
--聚合函数SUM表示你需要怎样处理转换后的列的值,是总和(sum),还是平均(avg)还是min,max等等
--例如如果T_Score表中有两条数据并且其Class_Name都是“语文”且Student_Name都是张三,其中一条的Score是90,另一条Score是100,那么在这里使用sum,行转列后“语文”这个列的值当然是190了
--后面的FOR Class_Name IN ( [语文], [英语], [数学] ...)中 for Class_Name就是说将Class_Name列的值分别转换成一个个列,也就是“以值变列”。但是需要转换成列的值有可能有很多,我们只想取其中几个值转换成列,那么怎样取呢?就是在in里面了,比如我此刻每个学生语文和数学的成绩,在in里面就只写“语文”和“数学”(注意,in里面是原来week列的值,"以值变列")。
--总的来说,SUM(Score) FOR Class_Name IN ( [语文], [英语], [数学] )
--这句的意思如果直译出来,就是说:将列Class_Name值为"[语文], [英语], [数学]分别转换成列,这些列的值取Score的总和。
结果:
2、比第一个问题更加深一步,要求,筛选出每个同学语文,数据,英语的成绩,并计算每个学生的总成绩
SELECT Student_Name , 语文 ,数学 ,英语 ,语文 + 数学 + 英语 AS 总成绩
FROM #T_Score PIVOT ( SUM(Score) FOR Class_Name IN ( 语文, 数学, 英语 ) ) p
结果:
二、使用UNPIVOT实现行转列
下面用实例来说明:
创建临时表#T_ClassScore,该表中包含四个字段,分别是学生姓名,语文、数学、英语的成绩
创建临时表的sql:
CREATE TABLE #T_ClassScore
(
学生姓名 VARCHAR(30),
语文 INT,
数学 INT,
英语 INT
)
向临时表中出入两条数据,结果为:

UnPivot for 的用法
SELECT * FROM #T_ClassScore
SELECT 学生姓名 ,
课程 ,
分数
FROM #T_ClassScore UNPIVOT( 分数 FOR 课程 IN ( 语文, 数学, 英语 ) ) p
--将语文,数学,英语列名改成列值,列名为课程。那么语文,数学,英语的原列值怎么办?取名为分数
Pivot For和UNPivot For的更多相关文章
- sql 行转列 PIVOT 列转行 UNPIVOT
原文:sql 行转列 PIVOT 列转行 UNPIVOT 一: 现有表一(t_table1),想转为表二(t_table2)的格式. 表一: 年 公司 收入 2013 公司1 12 2013 公司2 ...
- Oracle行转列,pivot函数和unpivot函数
pivot函数:行转列函数: 语法:pivot(任一聚合函数 for 需专列的值所在列名 in (需转为列名的值)):unpivot函数:列转行函数: 语法:unpivot(新增值所在列的列名 for ...
- PIVOT函数与UNPIVOT函数的运用
PIVOT用于将行转为列,完整语法如下: TABLE_SOURCE PIVOT( 聚合函数(value_column) FOR pivot_column IN(<column_list>) ...
- SSIS ->> Control Flow And Data Flow
In the Control Flow, the task is the smallest unit of work, and a task requires completion (success, ...
- T-SQL——数据透视和逆透视
目录 0. 测试数据集及说明 0.1 准备测试数据 0.2 对一维表和二维表理解 1. 透视转换 1.1 使用标准SQL进行数据透视 1.2 使用T-SQL中pivot函数进行数据透视 1.3 关于 ...
- Pivot 和 Unpivot
在TSQL中,使用Pivot和Unpivot运算符将一个关系表转换成另外一个关系表,两个命令实现的操作是“相反”的,但是,pivot之后,不能通过unpivot将数据还原.这两个运算符的操作数比较复杂 ...
- SQL Server中行列转换 Pivot UnPivot
SQL Server中行列转换 Pivot UnPivot PIVOT用于将列值旋转为列名(即行转列),在SQL Server 2000可以用聚合函数配合CASE语句实现 PIVOT的一般语法是:PI ...
- SQL(横表和纵表)行列转换,PIVOT与UNPIVOT的区别和使用方法举例,合并列的例子
使用过SQL Server 2000的人都知道,要想实现行列转换,必须综合利用聚合函数和动态SQL,具体实现起来需要一定的技巧,而在SQL Server 2005中,使用新引进的关键字PIVOT/UN ...
- T-SQL Recipes之Dynamic PIVOT and UNPIVOT
PIVOT PIVOT在行转列的时候经常用到,最便捷的方式就是通过示例来理解它的作用. 示例1 Query to Return Select Product Data from AdventureWo ...
随机推荐
- centos 7中监控mysql 数据库脚本(监控端口)
centos 7中监控mysql 数据库脚本(监控端口) 监控mysql数据库的方法如下: 1.监控端口 netstat -nltp |grep 3306 2.监控进程 ps -ef |grep 33 ...
- 【maven】之nexus常用的一些配置
nexus私服主要是在项目和maven中央仓库中间做代理,一般在公司内网或者公司内部的一些私包,都需要这么个产品.下面主要是关于maven和nexus之间的一些配置 1.在pom中配置nexus私服 ...
- js window.location用法
<script> //设置或获取 href 属性中跟在问号后面的部分. console.log(window.location.search)//设置或获取对象指定的文件名或路径conso ...
- Android批量验证渠道、版本号(Linux版)
功能:可校验单个或目录下所有apk文件的渠道号.版本号(Linux版本)使用说明:1.copy需要校验的apk文件到VerifyChannelVersion目录下2../VerifyChannelVe ...
- web--webstorm的一些常用快捷键
Webstorm的一些常用快捷键 下面是Webstorm的一些常用快捷键: Alt+回车 导入包,自动修正 1. ctrl + shift + n: 打开工程中的文件,目的是打开当前工程下任意目录 ...
- 导出Excel实现 (ASP.NET C# 代码部分)
背景: 实现导出Excel功能. 技术: ASP.NET , 采用`Aspose.Cells`第三方组件, C# 实现通用部分. 根据前台Ext Grid完成导入Excel中文列与实际存储列的对应关 ...
- 机器学习简要笔记(五)——Logistic Regression(逻辑回归)
1.Logistic回归的本质 逻辑回归是假设数据服从伯努利分布,通过极大似然函数的方法,运用梯度上升/下降法来求解参数,从而实现数据的二分类. 1.1.逻辑回归的基本假设 ①伯努利分布:以抛硬币为例 ...
- Django model 字段类型及选项解析
字段类型选择: AutoField(Field) - int自增列,必须填入参数 primary_key=True BigAutoField(AutoField) - bigint自增列,必须填入参数 ...
- Windows下文件加固
今天学到一种Windows下简单的文件加固方法,可以防止文件被(普通)删除. CMD找到要加固的文件. 例:C盘下有个 1516.txt 文本文件需要加固. 然后 copy 该文件.(注意:这里并非普 ...
- 代码: !AJAX
http://www.cnblogs.com/cwp-bg/p/7668840.html ajax和jsonp使用总结 2017-10-17 var requestUrl="http://l ...