在MySQL中实现交叉表查询1(静态交叉表)

一、什么是交叉表

交叉表查询是将来源于某个表中的字段进行分组,一组列在交叉表左侧,一组列在交叉表上部,并在交叉表行与列交叉处显示表中某个字段的各种计算值。比如:

create table stu(s_id int auto_increment,name char(20) not null default '',gender char(5) not null default '',age int not null default 0,class char(10) not null default '',primary key(s_id)
);insert into stu(name,gender,age,class)
values('张平','男',20,'物流1班'),('王刚','男',21,'物流1班'),('刘静','女',18,'物流1班'),
('张静静','女',21,'物流1班'),('刘涛','男',19,'物流1班'),('王晓刚','男',20,'营销2班'),
('王红','女',17,'营销2班'),('刘梅','女',19,'营销2班'),('张军','男',20,'营销2班'),
('张成','男',19,'营销2班'),('张晓媛','女',18,'营销2班'),('张华','男',21,'国贸1班'),
('王晓红','女',17,'国贸1班'),('张晓梅','女',19,'国贸1班'),('张涛','男',18,'国贸1班');
select * from stu;

根据class和gender两个字段进行分组查询,统计每个班级的男生和女生的平均分:

select class,gender,avg(age) from stu group by class,gender;

查询结果如下:

根据以上查询结果可以生成交叉表,其中class分组作为行,gender分组作为列,结果如下图所示:

使用交叉表查询来计算和重构数据,可以简化数据分析。交叉表查询计算数据的总和,平均值,计数及其他类型的统计,并将它们分组,一组列在数据表左侧作为交叉表的行字段,另一组列在数据表的顶端作为交叉表的列字段。

交叉表分为静态交叉表和动态交叉表。其中静态交叉表中的列是固定的,因此相对容易实现;而动态交叉表中的列需要动态生成。

二、静态交叉表的实现

MySQL不提供直接创建交叉表的命令,如果需要创建交叉表可以采用以下步骤:

step1 创建三张表,student(学生)、course(课程)、score(成绩),命令如下:

create table student(s_id int primary key auto_increment comment '学生学号',s_name char(20) comment '学生姓名',age int comment '学生年龄'
);create table course(c_id int primary key auto_increment comment '课程编号',c_name char(20) comment '课程名称',credits int comment '课程学分'
);create table score(s_id int comment '学生学号',c_id int comment '课程编号',score int comment '成绩',primary key(s_id,c_id)
);

step2 为以上三张表插入必要的数据,命令如下:

insert into student
values(1001,'张平',20),(1002,'王刚',21),(1003,'张静静',19),
(1004,'王涛',20),(1005,'王鹏飞',19);insert into course
values(1,'数据库',4),(2,'数据结构',4),(3,'管理学',3),(4,'英语',4),(5,'电子商务',3);insert into score
values(1001,1,80),(1001,2,90),(1001,3,77),(1001,4,87),(1001,5,69),
(1002,1,87),(1002,2,67),(1002,3,78),(1002,4,98),(1002,5,78),
(1003,1,66),(1003,2,77),(1003,3,88),(1003,4,99),(1003,5,66),
(1005,1,81),(1005,2,83),(1005,3,62),(1005,4,68),(1005,5,72),
(1004,1,72),(1004,2,60),(1004,3,84),(1004,4,88),(1004,5,74);

step3 创建交叉表,显示每个学生每一门课程的分数,其中表的左侧显示学生姓名,每一门课程生成一列,在学生姓名和课程交叉处显示某个学生某门课程的成绩,命令如下:

select IFNULL(s_name,'总分') as '姓名',sum(if(c_name='数据库',score,0)) as '数据库',
sum(if(c_name='数据结构',score,0)) as '数据结构',
sum(if(c_name='管理学',score,0)) as '管理学',sum(if(c_name='英语',score,0)) as '英语',
sum(if(c_name='电子商务',score,0)) as '电子商务',sum(score) as '总分'
from (select s_name,c_name,score from student s,course c,score sc where s.s_id=sc.s_id and c.c_id=sc.c_id) tmp
group by s_name
with rollup;

说明:Mysql中的with rollup是用来在分组统计数据的基础上再进行统计汇总,即用来得到group by的汇总信息。查询结果如下图所示:

也可以用union生成汇总行,代码如下:

select s_name,sum(if(c_name='数据库',score,0)) as '数据库',
sum(if(c_name='数据结构',score,0)) as '数据结构',
sum(if(c_name='管理学',score,0)) as '管理学',sum(if(c_name='英语',score,0)) as '英语',
sum(if(c_name='电子商务',score,0)) as '电子商务',sum(score) as '总分'
from (select s_name,c_name,score from student s,course c,score sc where s.s_id=sc.s_id and c.c_id=sc.c_id) tmp
group by s_name
union
select '总分',sum(if(c_id=1,score,0)),sum(if(c_id=2,score,0)),sum(if(c_id=3,score,0)),
sum(if(c_id=4,score,0)),sum(if(c_id=5,score,0)),sum(score)
from score;

查询结果如下图所示:

也可以不使用子查询,语法格式如下:

select IFNULL(s_name,'总分') as '姓名',sum(if(c_name='数据库',score,0)) as '数据库',
sum(if(c_name='数据结构',score,0)) as '数据结构',
sum(if(c_name='管理学',score,0)) as '管理学',sum(if(c_name='英语',score,0)) as '英语',
sum(if(c_name='电子商务',score,0)) as '电子商务',sum(score) as '总分'
from student s,course c,score sc where s.s_id=sc.s_id and c.c_id=sc.c_id
group by s_name
with rollup;

在MySQL中实现交叉表查询1(静态交叉表)相关推荐

  1. MySQL讲义第 33 讲——select 查询之静态交叉表查询

    MySQL讲义第 33 讲--select 查询之静态交叉表查询 文章目录 MySQL讲义第 33 讲--select 查询之静态交叉表查询 一.数据准备 二.交叉表的形式 三.静态交叉表的实现 1. ...

  2. 不同服务器数据库表连接查询修改,如何连接多个数据库,mysql中的服务器和查询两个表中的对方?...

    我期待从不同服务器连接两个不同的数据库.此外,我想运行一个查询,从两个数据库中获取数据到一个单一的结果.我正在使用mysql在PHP脚本中执行此操作.这里是如何很期待做[没有成功:)]如何连接多个数据 ...

  3. mysql怎么子查询_在mysql中如何进行子查询?

    在mysql中,子查询是指将一个查询语句嵌套在另一个查询语句中,可以在SELECT.UPDATE和 DELETE语句中配合WHERE子句进行实现,WHERE子句中语法格式为"WHERE (另 ...

  4. 【MySQL】多表查询策略(多表联查子查询)

    目录 一.MySQL多表查询 二.准备工作 1.运行环境 2.创建公司表 3.创建员工表 三.多表查询 (一)多表联查-同时查询多张表 1.联结 2.左连接 3.右连接 4.右连接 (二)子查询 1. ...

  5. mysql多表查询视图_mysql多表查询并创建视图

    匿名用户 1级 2016-12-03 回答 MySQL在多个数据表上创建视图 在MySQL中,使用CREATE VIEW语句也可以在两个或两个以上的数据表上创建视图. 实例 在department表和 ...

  6. mysql 查询过滤_在MySQL中,如何对查询结果进行条件过滤

    昨天和大家一起学习了在mysql中,如何分组查询统计,但是有时候也会遇到这样的一个问题,比如我在查询中,已经做了分组统计,但是我想对于这个结果进行条件过滤?应该如何处理呢? 我们一样用之前的员工表em ...

  7. MySQL中实现rank排名查询

    MySQL中实现rank排名查询 1.基本知识: 2.升序排列,排名继续增加 3.降序排列,排名继续增加 4.升序排列,排名不跳级,继续+1,示例一 5.升序排列,排名不跳级,继续+1,示例二 6.升 ...

  8. 面向考试数据库—单表查询(包含建表数据)

    面向考试数据库-单表查询(包含建表数据) 引言 ● 建立练习数据库(之后习题亦是基于该库) 建表源码 单表查询知识点汇总 单表查询练习题32道 (1)选取表中的若干列 (2)选择表中若干元祖 (3)o ...

  9. SQL语句多表查询:【多表连查】和【子查询】

    SQL语句多表查询:[多表连查]和[子查询] 说明:insert.update.delete只针对[一张表]执行操作. 说明:select可以查询一张表.也可以查询多张表. 说明:多表查询分为:[多表 ...

  10. VLOOKUP函数制作多表查询(学生信息表/员工工资表)

    VLOOKUP函数制作多表查询(学生信息表/员工工资表) 一.vlookup函数定义 VLOOKUP函数是Excel中的一个纵向查找函数,在工作中都有广泛应用,例如可以用来核对数据,多个表格之间快速导 ...

最新文章

  1. 【论文速读】城市自动驾驶应用的概率语义地图
  2. Android UI体验之全屏沉浸式透明状态栏效果
  3. 初学Golang:channel的使用
  4. VTK:Filtering之Glyph3D
  5. 条件 推导 迭代 并行
  6. Internationalization(i18n) support in SAP CRM,UI5 and Hybris
  7. 另一种方式实现事务码SE16里的结果集修改
  8. java私有属性和私有方法_Java接口–历年来Java 9之旅–默认方法和私有方法
  9. Discuz!客户端api开发(一)
  10. 微信小程序 +第三方 直播-IM在线聊天
  11. 通过tomcat插件启动Maven工程
  12. php时钟制作心得,电子钟课程设计心得
  13. brctl 设置ip_linux下brctl配置网桥
  14. flash 插件 安装
  15. HTTP 的长连接和短连接
  16. layui 模板判断_浅谈layui使用模板引擎动态渲染元素要注意的问题
  17. java基础-取余数,取商
  18. unity blend 笔记
  19. 排序算法系列:归并排序算法
  20. 如何用计算机控制家带你开关,kg316t微电脑时控开关怎么调 微电脑时控开关设置方法【图文】...

热门文章

  1. 微信程序开发系列教程(二)微信订阅号+人工智能问答服务
  2. arch模型的思路_ARCH模型的应用
  3. 一文了解巨量引擎的买量产品矩阵:巨量云图、巨量方舟、巨量广告、巨量纵横
  4. 点线面的意义_【干货】设计中的点线面到底有什么用?
  5. 疫情危机中看待业务韧性
  6. E1. Divisible Numbers (easy version)(数学)
  7. B. Shifting Sort- Codeforces Round #744 (Div. 3)
  8. 设计模式——访问者模式
  9. Hive学习之路 (二)Hive安装
  10. algorithm2e笔记,记录一下常规操作