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

article/2025/6/8 8:57:48

在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;


http://chatgpt.dhexx.cn/article/7ojIQe1e.shtml

相关文章

5.7.1 使用向导创建交叉表查询

示例ACCESS数据库下载链接: https://download.csdn.net/download/ngbshzhn/20979935 使用交叉表查询计算和重构数据,可以简化数据分析,交叉表查询计算数据的总和、平均值、计数或其他类型的总计值,并将它们分组。一组列在数…

5.7.2 使用设计视图创建交叉表查询

交叉表查询由三部分组成,行标题字段、列标题字段和值字段。按照Access的规定,列标题字段和值字段只能各有一个,行标题字段最多可以有3个。 (1)打开“罗斯文”数据库,在“创建”选项卡上的“查询”组中,单击“查询设…

计算机研究生学习路线

一、研究方向 研究方向来源:导师指定、咨询师兄师姐继续沿着他们的方向做深入研究、自己选方向。本节主要介绍自己如何选方向。 1.1paperswithcode 首先,进入The latest in Machine Learning | Papers With Code,我们可以看到主菜单栏&…

本人以及硕士期间研究介绍

读者们大家好 ~ 这篇博客是本人的第一篇博文,我将对自己的研究内容做一下简要的梳理,也欢迎感兴趣的小伙伴和我一起讨论。 ~ 我是一名工科硕士,本科就读于北京理工大学宇航学院,硕士期间申请硕博连读继续…

计算机学硕研究计划,博士研究生学习计划和研究计划

博士研究生学习计划和研究计划 时间是箭,去来迅疾,我们又将有新的学习内容,迎来新的挑战,是时候写学习计划了哦。好的学习计划都具备一些什么特点呢?以下是小编收集整理的博士研究生学习计划和研究计划,仅供参考,希望能够帮助到大家。 为了给博士学习生活开好头,不断学…

中职生职业生涯规划书2000字学计算机,计算机专业中职生职业生涯规划书

计算机专业中职生职业生涯规划书 下面是小编为中职生计算机专业整理的职业生涯规划书范文,供参考。 一、前言 九年义务教育,我们在儿童的懵懂、自由的嬉戏和父母的纵容中,快乐的度过;三年的高中生活,我们在学生们逐渐激烈的竞争、老师日益严肃的面孔和漫天飞舞的试卷中,艰…

python职业规划书_大学生职业规划书

职业生涯规划(简称生涯规划),又叫职业生涯设计,是将个人与组织相结合,在对一个人职业生涯的主客观条件进行测定、分析、总结的基础上,对自己的兴趣、爱好、能力、特点进行综合分析与权衡,结合时…

回忆我的过去一年2020年考研以及研究生规划

目录 一、启发二、回忆考研录(多图警告)(一)大三寒假入门考研(二)大三下学期进入学习状态(三)大三暑假强化巩固知识(四)大四上学期冲刺考试(五&am…

计算机专业读研期间的规划,【图片】2020考研,老学长教你如何规划!【计算机考研吧】_百度贴吧...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 二、关键一步——院校选择 我把各位同学的院校选择阶段分为以上几个阶段,因为考研这一年中,很多人的目标院校并不是固定不变的,而是随着不同阶段而改变的。学长我在大三下学期这一时间段内也多次…

源代码分析

/**/ // // 制作一个定时器,2位显示秒,2位显示分,用4个调节按钮调节 // 四个调节按钮为key0, key1, key2, key3分别为P3.2, P3.3, P3.4, P3.5 // 数码管用P0显示a,b,c,d,e,f,g,分别对应P0.0, P0.1, P0.2, P0.3, P0.4, P0.5, P0.6,…

IntelliJ IDEA 智能代码分析

IntelliJ IDEA 智能代码分析 # IntelliJ IDEA 会分析你的代码,在项目中查找文件和语言之间的关联。并使用这些信息,向你提供深度的代码帮助,快速导航,以及错误分析和重构。 1. IDEA的智能完成功能 // 按Ctrl+Shift+Space可以触发 // 通过Ctrl+Shift+Space快捷键组合,I…

Understand: 静态代码分析神器

一直以来,我以为Source Insight的代码分析已经是业界最强、最专业。今天试用了一下Scitools的Understand,导入代码后直接可以生成图形化分析结果,包括模块间调用,函数调用流程等,确实比较震撼。 文章目录 1. 设置2. 导…

RTMPdump 源代码分析 1: main()函数

RTMPdump(libRTMP) 源代码分析系列文章: RTMPdump 源代码分析 1: main()函数 RTMPDump (libRTMP) 源代码分析2:解析RTMP地址——RTMP_ParseURL() RTMPdump (libRTMP) 源代码分析3: AMF编码 RTMPdump (libRTMP) 源代码分析4&am…

JM代码分析(一)

JM代码分析(一) 入门视频采集与处理(学会分析YUV数据)核心编码函数研究码流控制RC去块滤波核心全局变量运动矢量的写码流从码流中提取NALU结构体00000(IDR)buf2img_basic宏块模式编码端写码流编码器:解码器&#xff1a…

代码分析:

爬虫组件分析 目录概述需求: 设计思路实现思路分析1.URL管理 DataTable 参考资料和推荐阅读 Survive by day and develop by night. talk for import biz , show your perfect code,full busy,skip hardness,make a better result,wait for change,chall…

推荐一款源代码统计分析、开发工作量估算、测试缺陷预测的开发工具 —— 代码统计分析工具(SourceCounter)

目录 一、软件简介 二、主要功能 三、更新日志 四、关键字 一、软件简介 代码统计分析工具 4.0,支持 30多种代码格式。能够统计包括:代码行数、注释、空行、文件大小等数据。另外,还支持对软件开发项目的各个开发阶段的工数、成本、质量…

恶意代码分析——基础技术篇

文章目录 恶意代码分析目的恶意代码分析方法恶意代码种类恶意代码静态分析环境在线反病毒引擎获取哈希值(certutil-hanshfile path MD5)查找字符串hive string ida火绒剑加壳&查壳文件加壳使用PEiD检测加壳 导入导出函数获取资源信息 常见的DLL程序恶…

Understand(代码分析工具)的安装与使用教程

前言 虽然自己一直都在CSDN上面学习相关知识和查找需要的各种资源,但或许是因为自己实在不知道自己的博客该写什么内容,于是博客的更新速度一慢再慢,进而停更一年左右,在这一点上,我认为自己应该作出批评与反省。 而…

如何看懂源代码--(分析源代码方法)

我们在写程序时,有不少时间都是在看别人的代码。 例如看小组的代码,看小组整合的守则,若一开始没规划怎么看, 就会“看得想哭 ” 不管是参考也好,从开源抓下来研究也好,为了了解箇中含意,在有限…

一文了解全面静态代码分析

在开发具有安全性、可靠性和合规性的软件时,全面静态代码分析是一种有效的方法。在这里,我们将就静态分析而言,讨论全面静态代码分析的不同之处,阐述全面静态代码分析的重要性,以及如何进行全面静态代码分析。 什么是全…