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. jdbc工具类封装

    封装 package util; import java.sql.Connection; import java.sql.DriverManager; import java.sql.Prepared ...

  2. 创建与合并分支-git入门教程

    在版本回退里,你已经知道,每次提交,Git都把它们串成一条时间线,这条时间线就是一个分支.截止到目前,只有一条时间线,在Git里,这个分支叫主分支,即master分支.HEAD严格来说不是指向提交,而 ...

  3. js中substring与substr的学习。

    今天在工作的过程中,看到js中两个双胞胎函数.分别是substring与substr.顿时被两个可恶的家伙给迷惑住了,不知道具体有什么作用.. 先来看看substring手册是怎么介绍的. 手册解释的 ...

  4. UVA1210Sum of Consecutive Prime Numbers(素数打表 + 连续和)

    题目链接 题意:输入一个数n (2 <= n <= 10000) 有多少种方案可以把n写成若干个连续素数之和 打出10000之内的素数表,然后再打出每个可能得到的和的方案数的表 #incl ...

  5. ubuntu14.04安装GoldenDict

    1. 软件商店搜索goldendict安装或者$ sudo apt-get install goldendict 2. 配置网页翻译源 编辑-->词典--->网站选项卡,点击添加 以下是有 ...

  6. Docker入门教程(六)另外的15个Docker命令

    Docker入门教程(六)另外的15个Docker命令 [编者的话]DockerOne组织翻译了Flux7的Docker入门教程,本文是系列入门教程的第六篇,继续介绍Docker命令.之前的第二篇文章 ...

  7. java编程思想-java中的并发(一)

    一.基本的线程机制 并发编程使我们可以将程序划分为多个分离的.独立运行的任务.通过使用多线程机制,这些独立任务中的每一个都将由执行线程来驱动. 线程模型为编程带来了便利,它简化了在单一程序中同时jia ...

  8. Linux下多线程下载工具 - Axel

    Axel 是 Linux 下一个不错的HTTP/FTP高速下载工具.支持多线程下载.断点续传,且可以从多个地址或者从一个地址的多个连接来下载同一个文件.适合网速不给力时多线程下载提高下载速度.比如在国 ...

  9. Java I/O流体系

  10. js中event的target和currentTarget的区别

    js中的event对象包含很多有用的信息 target:触发事件的元素. currentTarget:事件绑定的元素. 两者在没有冒泡的情况下,是一样的值,但在用了事件委托的情况下,就不一样了,例如: ...