SQL通过pivot进行行列转换 数据透视

可直接在sql server 运行

传统操作 和 pivot

create table XKCl
(name nchar(10) not null,
学科 nchar(10) not null,
成绩 int not null,
考试 nchar(10) not null
) insert into dbo.XKCJ values ('张三','语文',79,'期中')
insert into dbo.XKCJ values ('李四','语文',85,'期中')
insert into dbo.XKCJ values ('王五','语文',75,'期中')
insert into dbo.XKCJ values ('张三','数学',93,'期中')
insert into dbo.XKCJ values ('李四','数学',98,'期中')
insert into dbo.XKCJ values ('王五','数学',87,'期中')
insert into dbo.XKCJ values ('张三','英语',92,'期中')
insert into dbo.XKCJ values ('李四','英语',90,'期中')
insert into dbo.XKCJ values ('王五','英语',88,'期中')
insert into dbo.XKCJ values ('张三','语文',80,'期末')
insert into dbo.XKCJ values ('李四','语文',81,'期末')
insert into dbo.XKCJ values ('王五','语文',79,'期末')
insert into dbo.XKCJ values ('张三','数学',90,'期末')
insert into dbo.XKCJ values ('李四','数学',95,'期末')
insert into dbo.XKCJ values ('王五','数学',80,'期末')
insert into dbo.XKCJ values ('张三','英语',92,'期末')
insert into dbo.XKCJ values ('李四','英语',90,'期末')
insert into dbo.XKCJ values ('王五','英语',85,'期末')
SELECT *
FROM XKCJ name 学科 成绩 考试
---------- ---------- ----------- ----------------
张三 语文 79 期中
李四 语文 85 期中
王五 语文 75 期中
张三 数学 93 期中
李四 数学 98 期中
王五 数学 87 期中
张三 英语 92 期中
李四 英语 90 期中
王五 英语 88 期中
张三 语文 80 期末
李四 语文 81 期末
王五 语文 79 期末
张三 数学 90 期末
李四 数学 95 期末
王五 数学 80 期末
张三 英语 92 期末
李四 英语 90 期末
王五 英语 85 期末

计算两次考试每名学生各科的最高成绩

select name,
max(case 学科 when '数学' then 成绩 else 0 end )as 数学,
max(case 学科 when '英语' then 成绩 else 0 end )as 英语,
max(case 学科 when '语文' then 成绩 else 0 end )as 语文
From dbo.XKCJ
group by name SELECT name,
max(数学) 数学,
max(英语) 英语,
max(语文) 语文
FROM dbo.XKCJ
pivot(max(成绩) FOR 学科 IN (语文,数学,英语)) tbnewtb
group by name SELECT *
FROM (select name,学科,成绩
from dbo.XKCJ) new
pivot(max(成绩) FOR 学科 IN (数学,英语,语文)) newtb name 数学 英语 语文
---------- ----------- ----------- -----------
李四 98 90 85
王五 87 88 79
张三 93 92 80

计算两次考试各科的最高成绩

select 考试 ,
max(case 学科 when '数学' then 成绩 else 0 end )as 数学,
max(case 学科 when '英语' then 成绩 else 0 end )as 英语,
max(case 学科 when '语文' then 成绩 else 0 end )as 语文
From dbo.XKCJ
group by 考试 SELECT *
FROM (select 考试,学科,成绩
from dbo.XKCJ) new
pivot(max(成绩) FOR 学科 IN (数学,英语,语文)) newtb 考试 数学 英语 语文
---------- ----------- ----------- -----------
期末 95 92 81
期中 98 92 85

行列转换

select name,考试,
sum(case 学科 when '数学' then 成绩 else 0 end )as 数学,
sum(case 学科 when '英语' then 成绩 else 0 end )as 英语,
sum(case 学科 when '语文' then 成绩 else 0 end )as 语文
From dbo.XKCJ
group by name,考试 SELECT *
FROM dbo.XKCJ
pivot(max(成绩) FOR 学科 IN (语文,数学,英语)) newtb name 考试 语文 数学 英语
---------- ----------- ----------- ----------- -----------
李四 期末 81 95 90
王五 期末 79 80 85
张三 期末 80 90 92
李四 期中 85 98 90
王五 期中 75 87 88
张三 期中 79 93 92
SELECT name,语文,数学,英语
FROM dbo.XKCJ
pivot(max(成绩) FOR 学科 IN (语文,数学,英语)) newtb
name 语文 数学 英语
---------- ----------- ----------- -----------
李四 81 95 90
王五 79 80 85
张三 80 90 92
李四 85 98 90
王五 75 87 88
张三 79 93 92

计算每个同学每次考试的总分、平均分

select name,考试,
sum(case 学科 when '数学' then 成绩 else 0 end )as 数学,
sum(case 学科 when '英语' then 成绩 else 0 end )as 英语,
sum(case 学科 when '语文' then 成绩 else 0 end )as 语文,
SUM(成绩) as total,
AVG(成绩) as 平均
From dbo.XKCJ
group by name,考试 SELECT *,
数学+英语+语文 as total,
(数学+英语+语文)/3 as 平均
FROM dbo.XKCJ
pivot(max(成绩) FOR 学科 IN (数学,英语,语文)) newtb name 考试 数学 英语 语文 total 平均
-------- ---------- ----------- ----------- ----------- ----------- -----------
李四 期末 95 90 81 266 88
王五 期末 80 85 79 244 81
张三 期末 90 92 80 262 87
李四 期中 98 90 85 273 91
王五 期中 87 88 75 250 83
张三 期中 93 92 79 264 88

SQL pivot 基本用法 行列转换 数据透视的更多相关文章

  1. SQL Fundamentals: 子查询 || 行列转换(PIVOT,UNPIVOT,DECODE),设置数据层次(LEVEL...CONNECT BY)

    SQL Fundamentals || Oracle SQL语言 子查询(基础) 1.认识子查询 2.WHERE子句中使用子查询 3.在HAVING子句中使用子查询 4.在FROM子句中使用子查询 5 ...

  2. SQL 行列转换数据转换为字符串

    行列转换,将列数据转换为字符串输出 ) SET @center_JZHW = ( SELECT DISTINCT STUFF( ( SELECT ',' + ce_code FROM ap_cente ...

  3. SQL SERVER 中的行列转换小结

    1. 介绍说明 前段时间组内的小伙伴在升级维护项目中,经常涉及一些复杂的数据转换问题,让我去看下有些地方怎么处理,我发现好多都是涉及到行列转换的问题,处理起来经常会比较麻烦,借此也总结一下,方便以后的 ...

  4. [数据库] SQL查询语句表行列转换及一行数据转换成两列

    原文来自:http://blog.csdn.net/Eastmount/article/details/50559008 本文主要讲述了SQL查询语句表之间的行列转换,同时也包括如何将一行数据转换成两 ...

  5. sql 语句写的行列转换

    以前面试老遇到一个行列转换的问题,今天没事,顺便记录一下 假设有这样一张表,如下图,创建表就不说了,直接建或者SQL语句都行 sql语句如下 --第一种 select name as 姓名, max( ...

  6. 【数据库】SQL经典面试题 - 行列转换二 - 列转行

    本帖子是行转列的一个逆向操作——列转行,看下面一个面试题 面试题2: 柠檬班第30期学生要毕业了,他们的Linux.MySQL.Java成绩数据表 tb_lemon_grade_column中, 表中 ...

  7. SQL中PIVOT和UNPIVOT行列转换

    DECLARE @sql_col VARCHAR(8000); DECLARE @sql_str VARCHAR(8000); DECLARE @sql_ VARCHAR(MAX); SELECT @ ...

  8. 数据透视表sql:用SQL行列转换实现数据透视的一些思考

    用SQL行列转换实现数据透视的一些思考 摘要:根据对报表开发过程中碰到的需要用SQL行列转换进行解决的一类查询统计问题的分析,逐步探索求解得到一种较通用的解决思路,并用函数进行实现.该解决思路及函数实 ...

  9. SQL行列转换6种方法

    在进行报表开发时,很多时候会遇到行列转换操作,很对开发人员针对于SQL级别行列转换操作一直不甚理解,今天正好抽空对其进行了一些简单的总结.这里主要列举3种可以实现SQL行列转换的方法,包括通用SQL解 ...

随机推荐

  1. Irrelevant Elements, ACM/ICPC NEERC 2004, UVa1635

    这种题目最重要的是思路了清晰 #include <cstdio> #include <cstring> ;//sqrt(n)+1 is enough ][]; ]; int a ...

  2. 使用grub手动引导linux和windows

    引导Linux 重启进入到grub菜单界面时,按“c”键进入grub命令模式.1.指定/boot所在的分区,比如分区是第一块硬盘第一分区,即hd0,0 grub> root (hd0,0) 2. ...

  3. excel2013添加坐标轴名称label

    图画好了,x.y轴没有名称,怎么办那 点击左上角有个---添加图标元素----里面有轴标题应该就是

  4. omnet++5.0安装使用

    1.下载Windows安装包,5.0的omnetpp-5.0-src-windows.zip 2.解压到d盘 3.D:\omnetpp-5.0\doc找到这个目录,下面有个InstallGuide.p ...

  5. UML活动图与流程图的区别

    http://blog.chinaunix.net/uid-11572501-id-3847592.html UML活动图与流程图的区别 (1).流程图着重描述处理过程,它的主要控制结构是顺序.分支和 ...

  6. restClient访问SSL

    IRestClient client = new RestClient("https://xxx.com/aa/bb"); "; ); ServicePointManag ...

  7. easyUI layout 中使用tabs+iframe解决请求两次方法

    demo中的事例在加载tab页面时是 function createFrame(url) { var s = '<iframe name="iframepanel" scro ...

  8. 一台机子上运行使用不同Java版本的多个tomcat

    方法 在tomcat/bin/下创建setenv.sh并写入 export JAVA_HOME=/usr/share/jvm/jdk1..0_91 When you starting tomcat u ...

  9. 15款优秀移动APP产品原型设计工具

    一新来小盆友问:“移动产品原型设计都用啥工具?” 答:“@#¥……&%*” 又问:“能详细说下各个工具吗?我比较一下” “……” 好吧,谁让我那么的爱分享而你又是小美女呢 ———————正文开 ...

  10. fcc的高级算法题

    核心提示:本部分一个9道题,给定时间50小时.属于fcc前端学习的"高级编程脚本"题,对于初学者来说,确实算是"高级"了.如果只想着闭门造车,50小时确实也不过 ...