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 ...
随机推荐
- PAT 乙级 1091 N-自守数 (15 分)
1091 N-自守数 (15 分) 如果某个数 K 的平方乘以 N 以后,结果的末尾几位数等于 K,那么就称这个数为“N-自守数”.例如 3×922=25392,而 25392 的末尾两位正好是 ...
- 刘志梅2017710101152.《面向对象程序设计(java)》第一周学习总结
本人学号<面向对象程序设计(java)>第一周学习总结 第一部分:课程准备部分 填写课程学习 平台注册账号, 平台名称 注册账号 博客园:www.cnblogs.com http://ww ...
- Vim 命令、操作、快捷键
打开单个文件:vim file 同时打开多个文件:vim file1 file2 file3 ... 在vim窗口中打开一个新文件 : :open file 在新窗口中打开文件: :split fi ...
- leetcode17
回溯法,深度优先遍历(DFS) public class Solution { int[] x; int N; string DIGITS; Dictionary<char, List<s ...
- Elasticsearch **代码片段
```JAVA BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery(); RangeQueryBuilder createTimeQuery ...
- IDEA使用SpringBoot 、maven创建微服务的简单过程
使用IDEA新建一个简单的微服务 1. 打开IDEA,File -> New -> project 打开如下图1-1所示的对话框 图 1-1 2.点击"Next"按钮 ...
- java中封装类(二)
java中的数字类型包括 Byte,Short,Integer,Long,Float,Double.其中前四个是整数,后两个是浮点数. 在说java中数字类型之前先来看看它们统一的基类Number. ...
- [phvia/firman] PHP多进程服务器模型中的惊群
[ 典型场景 ] 典型的多进程服务器模型是这样的,主进程绑定ip,监听port,fork几个子进程,子进程安装信号处理器,随后轮询资源描述符检查是否可读可写: 子进程的轮询又涉及到 IO复用,acce ...
- 简单定时器的Java实现
这两个类使用起来非常方便,可以完成我们对定时器的绝大多数需求 Timer类是用来执行任务的类,它接受一个TimerTask做参数 Timer有两种执行任务的模式,最常用的是schedule,它可以以两 ...
- Junit介绍以及使用
在介绍junit之前,把一些知识点提前了解一下 单元测试是一个对单一实体(类或方法)的测试. 测试用例(Test Case)是为某个特殊目标而编制的一组测试输入.执行条件以及预期结果,以便测试某个程序 ...