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解 ...
随机推荐
- Nginx research, nginx module development
catalog . 初探nginx架构 . handler模块 . Nginx编译.安装.配置 . Hello World模块开发 1. 初探nginx架构 nginx在启动后,在unix系统中会以d ...
- C#制作验证码
void CodeImage(string code) { if (code == null || code.Trim() == string.Empty) return; System.Drawin ...
- 数据结构算法C语言实现(一)---2.2线性表的顺序表示和实现
注意: 虽然是用C语言实现,但是考虑到使用了一个C++的特性----引用以简化代码,所以所有的代码均以cpp作为后缀,用g++编译(以后不做说明). g++版本: 一.简述 本节主要讲述线性表的顺序实 ...
- 如何保持自己 fork 的项目和原始项目同步
首先先通过 github 的 web 页面 fork 目标的项目 前提是自己已经设置好了git,并且配置了相应的权限 然后使用git clone命令在本地克隆自己 fork 的项目: git clon ...
- 导入.pch文件
Xcode5中创建一个工程的时候,系统会自动创建一个以以工程名为名字的pch(Precompile Prefix Header)文件,开发的过程中可以将广泛使用的头文件以及宏包含在该文件下,编译器就会 ...
- 3 构建Mysql+heartbeat+DRBD+LVS集群应用系统系列之heartbeat的搭建
preface 在上节的说了mysql的搭建,这节我们在上节的基础上,继续搭建heartbeat. 安装和配置heartbeat 采用yum安装,dbmaster81和dbbackup136上都安装, ...
- B2B电子商务网站技术框架
一 设计原则 电子商务平台总体结构的设计应从体系.功能.信息.过程等各个方面保证整个电子商务平台总体目标的实现,以提高市场竞争能力.总体结构的设计应考虑以下设计原则: 快速响应原则:商机稍纵即逝,网站 ...
- SVN服务器配置说明
1.前 言 花了72小时,终于把 Subversion 初步掌握了.从一个连“什么是版本控制”都不知道的门外汉,到配置出精确至每目录访问的入门者,中间还卡了一天时间.其中费了许多气力,摸索实验了多次, ...
- Linux常用服务部署与优化之Samba篇
关于Samba的简介概述在此略过,开始搭建Samba服务. 1.安装Samba yum install -y samba samba-client 2.编辑Samba配置文件 首先共享一个目录,任何人 ...
- ecshop修改产品详情 折扣倒计时时间
文件:lefttime.js 位置:/js/lefttime.js 要求:去掉倒计时时间的 “天”数 原代码 ) { Temp = dateLeft + _day + hourZero + hour ...