行列转化【附加面试题】

在MySQL中,行列转换是一种常见的操作。它包括行转列和列转行两种情况。

  1. 行转列:行转列是将表中的某些行转换成列,以提供更为清晰、易读的数据视图。例如,假设我们有一个包含科目和分数的表,我们可以使用SUM和CASE语句将每个科目的分数转换为单独的列。此外,从MySQL 8.0版本开始,还提供了PIVOT函数来实现行转列的操作。例如:
    SELECT aggregated_column, [pivot_value_1], [pivot_value_2], ..., [pivot_value_n] 
    FROM (select...) AS source_table 
    PIVOT ( aggregate_function (column_for_aggregation) 
    FOR column_for_pivot IN ([pivot_value_1], [pivot_value_2], ..., [pivot_value_n]) ) AS pivot_table;
    
  2. 列转行:列转行则是将表中的某些列转换成行,每行包含一列的值。具体的操作方法包括使用聚合函数、group_concat函数或动态SQL语句块等。例如,可以使用GROUP_CONCAT函数将某一列的值拼接成一个字符串,然后用聚合函数进行分组。
测试题:
DROP TABLE IF EXISTS `stu`;
CREATE TABLE `stu`  (`sname` varchar(20) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,`sub` varchar(20) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,`score` varchar(20) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = Dynamic;-- ----------------------------
-- Records of stu
-- ----------------------------
INSERT INTO `stu` VALUES ('zs', 'chinese', '100');
INSERT INTO `stu` VALUES ('zs', 'math', '99');
INSERT INTO `stu` VALUES ('zs', 'english', '98');
INSERT INTO `stu` VALUES ('li', 'chinese', '80');
INSERT INTO `stu` VALUES ('li', 'math', '89');
INSERT INTO `stu` VALUES ('li', 'english', '88');
INSERT INTO `stu` VALUES ('ww', 'chinese', '70');
INSERT INTO `stu` VALUES ('ww', 'math', '79');
INSERT INTO `stu` VALUES ('ww', 'english', '78');SET FOREIGN_KEY_CHECKS = 1;

初始化数据: 

现在进行行列转换:

	select sname,case sub when "chinese" then score end "语文",case sub when "math" then score end "数学",case sub when "english" then score end "英语"from stu;

 

 现在进行分组统计,然后合并:

	select sname,max(case sub when "chinese" then score end) "语文",min(case sub when "math" then score end) "数学",avg(case sub when "english" then score end) "英语"from stuGROUP BY sname;

现在行列转化已经完成!

行转化为列:

小结:case [列名] when [条件] then [数据] end

面试题1:
人员情况表(employee)中字段包括,员工号(ID),姓名(name),年龄(age),文化程度(wh):
包括四种情况(本科以上,大专,高中,初中以下),
现在我要根据年龄字段查询统计出:
表中文化程度为本科以上,大专,高中,初中以下,各有多少人,占总人数多少。
结果如下A:
学历     年龄  人数  百分比
本科以上  20    34     14
大专      20    33    13
高中      20    33    13
初中以下  20    100    40
本科以上  21    50     20
。。。。。。
SQL 查询语句如何写?create table employee(id int primary key auto_increment,name varchar(20),age int(2),wh varchar(20)) ;insert into employee(id,name,age,wh) values (null,'a',20,'本科以上') ;
insert into employee(id,name,age,wh) values (null,'b',20,'本科以上') ;
insert into employee(id,name,age,wh) values (null,'c',21,'本科以上') ;
insert into employee(id,name,age,wh) values (null,'d',20,'本科以上') ;
insert into employee(id,name,age,wh) values (null,'e',20,'大专') ;
insert into employee(id,name,age,wh) values (null,'e',21,'大专') ;
insert into employee(id,name,age,wh) values (null,'e',21,'高中') ;
insert into employee(id,name,age,wh) values (null,'e',20,'高中') ;
insert into employee(id,name,age,wh) values (null,'e',20,'初中以下') ;

 起始数据:

通过wh[文化]、age[年龄]分组,即可统计出来: 

select wh '学历',age '年龄',count(*) '人数', round((count(*)/(select count(0) from employee)) * 100)  '百分比'
from employee 
GROUP BY wh ,age
ORDER BY age;

面试题2:
-- 8:00--12:00 为迟到, 12:00--18:00 为早退
-- 打卡表 cardcreate table card(cid int(10),ctime timestamp ,cuser int(10));--  人员表 person
create table person(pid int(10),name varchar(10)
) ;-- 插入人员表的数据
insert into person values(1,'a');
insert into person values(2,'b');-- 插入打卡的数据
insert into card values(1,'2009-07-19 08:02:00',1);
insert into card values(2,'2009-07-19 18:02:00',1);
insert into card values(3,'2009-07-19 09:02:00',2);
insert into card values(4,'2009-07-19 17:02:00',2);
insert into card values(5,'2009-07-20 08:02:00',1);
insert into card values(6,'2009-07-20 16:02:00',1);
insert into card values(7,'2009-07-20 07:02:00',2);
insert into card values(8,'2009-07-20 20:02:00',2);--  查询 迟到 早退的员工姓名?
查询结果如下:
工号     姓名    打卡日期     上班打卡    下班打卡        迟到    早退
1         a      2009-07-19   08:02:00    18:02:00  			 是      否
1         a      2009-07-20   08:02:00    16:02:00 				 是      是
2         b      2009-07-19   09:02:00    17:02:00			   是      是

初始化表: 

 

-- 先查出每一个员工打卡的时间
select p.*,c.ctime
from person p join card c on c.cuser = p.pid;-- 将日期格式化
select p.pid "工号",p.name "姓名",DATE_FORMAT(c.ctime,'%y-%m-%d') "打卡日期",DATE_FORMAT(c.ctime,'%h:%i:%s') "打卡时间"
from person p join card c on c.cuser = p.pid;-- 将日期分离成上下午
select p.pid "工号",p.name "姓名",DATE_FORMAT(c.ctime,'%y-%m-%d') "打卡日期",DATE_FORMAT(c.ctime,'%h:%i:%s') "打卡时间"
from person p join card c on c.cuser = p.pid

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/412845.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

银河麒麟操作系统 v10 中离线安装 Docker

银河麒麟操作系统 v10 中离线安装 Docker 1. 查看系统版本2. 查看 Linux 内核版本(3.10以上)3. 查看 iptabls 版本(1.4以上)4. 判断处理器架构5. 离线下载 Docker 安装包6. 移动解压出来的二进制文件到 /usr/bin 目录中7. 配置 Do…

基于TCP的全双工网络编程实践

首先我们先了解一下什么是全双工通信? 全双工数据通信允许数据同时在两个方向上传输,因此,全双工通信相当于是两个单工通信方式的结合,它要求发送设备和接收设备都有独立的接收和发送能力。 TCP服务端代码: #includ…

【控制篇 / 分流】(7.4) ❀ 01. 对指定IP网段访问进行分流 ❀ FortiGate 防火墙

【简介】公司有两条宽带,一条ADSL拨号用来上网,一条移动SDWAN,已经连通总部内网服务器,领导要求,只有访问公司服务器IP时走移动SDWAN,其它访问都走ADSL拨号,如果你是管理员,你知道有…

系统性学习vue-vuex

系统性学习vue-vuex 理解vuexvuex工作原理搭建vuex环境案例Vuex的开发者工具使用getters配置项mapState与mapGettersmapActions和mapMutationsvuex模块化namespace 理解vuex 概念: 专门在Vue中实现集中式状态(数据)管理的一个Vue插件&#xf…

使用Sqoop的并行处理:扩展数据传输

使用Sqoop的并行处理是在大数据环境中高效传输数据的关键。它可以显著减少数据传输的时间,并充分利用集群资源。本文将深入探讨Sqoop的并行处理能力,提供详细的示例代码,以帮助大家更全面地了解和应用这一技术。 Sqoop的并行处理 在开始介绍…

Python用selenium实现自动登录和下单的项目实战

前言 学python对selenium应该不陌生吧 Selenium 是最广泛使用的开源 Web UI(用户界面)自动化测试套件之一。Selenium 支持的语言包括C#,Java,Perl,PHP,Python 和 Ruby。目前,Selenium Web 驱动…

【音视频原理】图像相关概念 ② ( 帧率 | 常见帧率标准 | 码率 | 码率单位 )

文章目录 一、帧率1、帧率简介2、常见帧率标准3、帧率 刷新率 二、码率1、码率简介2、码率单位 一、帧率 1、帧率简介 帧率 Frame Rate , 帧 指的是 是 画面帧 , 帧率 是 画面帧 的 速率 ; 帧率 的 单位是 FPS , Frames Per Second , 是 每秒钟 的 画面帧 个数 ; 帧率 是 动画…

头像空白问题

当用户没有设置头像时,我们可以使用用户名第一个字来当头像 主要涉及一个截取,截取字符串第一个字 变量名.charAt(0) 如果变量名为null或者undefine 那么就会报错 使用可选链操作符 ? 当前面的值为nul或undefine时,就不会执行…

011:vue结合css动画animation实现下雪效果

文章目录 1. 实现效果2. 编写一个下雪效果组件 VabSnow.vue3. 页面使用4. 注意点 1. 实现效果 GIF录屏文件太卡有点卡&#xff0c;实际是很丝滑的 2. 编写一个下雪效果组件 VabSnow.vue 在 src 下新建 components 文件&#xff0c;创建VabSnow.vue组件文件 <template>…

第三届iEnglish全国ETP大赛展现教育游戏新趋势

随着社会步入数字化纪元,游戏作为信息交流和传播的重要载体,在教育领域的潜能日益凸显。特别是寓教于乐的“教育游戏”学习方式让更多家长和孩子体验到“玩中学,学中玩”的乐趣,在教育领域的潜能也日益凸显。 本周五(1月19日)晚上7点,国内首个教育游戏赛事、以“玩转英语,用iE…

在国外外出结账时应该怎样表述,柯桥生活英语学习

大家平时外出就餐时&#xff0c;尤其是那种外国餐厅&#xff0c;结账时都怎么表达&#xff1f;可能大家会脱口而出“how much”..... 如果你真的这么说&#xff0c;那可就“踩雷”了。因为&#xff0c;在歪果仁的文化中&#xff0c;用how引导的疑问句都或多或少涉及隐私问题&am…

触发器简述

数据库是与表有关的数据库对象&#xff0c;在执行insert&#xff0c;delete&#xff0c;update之前或之后&#xff0c;触发并执行触发器中定义的sql语句集合&#xff0c;来保证数据的完整性等操作,目前只支持行级触发器&#xff0c;而不支持语句触发器。 触发器的语法&#xff…