SQL pivot 基本用法 行列转换 数据透视
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 基本用法 行列转换 数据透视的更多相关文章
- SQL Fundamentals: 子查询 || 行列转换(PIVOT,UNPIVOT,DECODE),设置数据层次(LEVEL...CONNECT BY)
SQL Fundamentals || Oracle SQL语言 子查询(基础) 1.认识子查询 2.WHERE子句中使用子查询 3.在HAVING子句中使用子查询 4.在FROM子句中使用子查询 5 ...
- SQL 行列转换数据转换为字符串
行列转换,将列数据转换为字符串输出 ) SET @center_JZHW = ( SELECT DISTINCT STUFF( ( SELECT ',' + ce_code FROM ap_cente ...
- SQL SERVER 中的行列转换小结
1. 介绍说明 前段时间组内的小伙伴在升级维护项目中,经常涉及一些复杂的数据转换问题,让我去看下有些地方怎么处理,我发现好多都是涉及到行列转换的问题,处理起来经常会比较麻烦,借此也总结一下,方便以后的 ...
- [数据库] SQL查询语句表行列转换及一行数据转换成两列
原文来自:http://blog.csdn.net/Eastmount/article/details/50559008 本文主要讲述了SQL查询语句表之间的行列转换,同时也包括如何将一行数据转换成两 ...
- sql 语句写的行列转换
以前面试老遇到一个行列转换的问题,今天没事,顺便记录一下 假设有这样一张表,如下图,创建表就不说了,直接建或者SQL语句都行 sql语句如下 --第一种 select name as 姓名, max( ...
- 【数据库】SQL经典面试题 - 行列转换二 - 列转行
本帖子是行转列的一个逆向操作——列转行,看下面一个面试题 面试题2: 柠檬班第30期学生要毕业了,他们的Linux.MySQL.Java成绩数据表 tb_lemon_grade_column中, 表中 ...
- SQL中PIVOT和UNPIVOT行列转换
DECLARE @sql_col VARCHAR(8000); DECLARE @sql_str VARCHAR(8000); DECLARE @sql_ VARCHAR(MAX); SELECT @ ...
- 数据透视表sql:用SQL行列转换实现数据透视的一些思考
用SQL行列转换实现数据透视的一些思考 摘要:根据对报表开发过程中碰到的需要用SQL行列转换进行解决的一类查询统计问题的分析,逐步探索求解得到一种较通用的解决思路,并用函数进行实现.该解决思路及函数实 ...
- SQL行列转换6种方法
在进行报表开发时,很多时候会遇到行列转换操作,很对开发人员针对于SQL级别行列转换操作一直不甚理解,今天正好抽空对其进行了一些简单的总结.这里主要列举3种可以实现SQL行列转换的方法,包括通用SQL解 ...
随机推荐
- Java Attach API
catalog . instrucment与Attach API . BTrace: VM Attach的两种方式 . Sun JVM Attach API 1. instrucment与Attach ...
- Linux Default Bootup、Startup、Autoload Configuration file(自启动服务脚本)
目录 . Linux初始化init系统 . Linux配置文件自动加载过程 1. Linux初始化init系统 Linux初始化init系统在不同操作系统系列下的区别 . RHEL : SysVini ...
- FZU 2191 完美的数字
题目链接: 传送门 完美的数字 Time Limit: 1000MS Memory Limit: 65536K 题目描述 Bob是个很喜欢数字的孩子,现在他正在研究一个与数字相关的题目,我们知 ...
- WPF资源字典
如果相同的资源可用于不同的应用程序,把资源放在一个资源字典中就比较有效. 新建一个资源字典文件Dictionary1.xaml <ResourceDictionary xmlns="h ...
- python小打小闹之简陋版BBS
闲的蛋疼,索性写个东西玩,于是,写个类似于BBS的念头就开始了. 我们考虑到需要实现的功能: 1 只有登陆的用户才可以点赞,如果没有登陆,那么不可以点赞,点赞次数只可以为1. 2 只有登陆的用户可以评 ...
- HD1269迷宫城堡(有向图 && 划分连通块)
迷宫城堡 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis ...
- POJ2635The Embarrassed Cryptographer(大数取余+素数筛选+好题)
题目链接 题意:K是由两个素数乘积,如果最小的素数小于L,输出BAD最小的素数,否则输出GOOD 分析 素数打表将 L 大点的素数打出来,一定要比L大,然后就开始枚举,只需K对 素数 取余 看看是否为 ...
- 机器学习笔记—Logistic回归
本文申明:本系列笔记全部为原创内容,如有转载请申明原地址出处.谢谢 序言:what is logistic regression? Logistics 一词表示adj.逻辑的;[军]后勤学的n.[逻] ...
- BIOS设置教程
BIOS设置图解教程之AMI篇 BIOS设置图解教程之AMI篇(目前主板上常见的BIOS主要为AMI与AWARD两个系列,如何辨别BIOS品牌系列请移步,本文详细讲解AMI系列的BIOS设置图解教程, ...
- HTML学习笔记——标签设置格式
1>标签设置格式 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http:/ ...