学习mysql 如何行转列与列传行
作者:孙中明 发布时间:2024-01-17 05:45:01
标签:mysql,行转列,列传行
一、行转列— case+group by
mysql> CREATE TABLE `TEST_TB_GRADE` (
-> `ID` int(10) NOT NULL AUTO_INCREMENT,
-> `USER_NAME` varchar(20) DEFAULT NULL,
-> `COURSE` varchar(20) DEFAULT NULL,
-> `SCORE` float DEFAULT '0',
-> PRIMARY KEY (`ID`)
-> ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
插入数据:
mysql> insert into TEST_TB_GRADE(USER_NAME, COURSE, SCORE) values
-> ("张三", "数学", 34),
-> ("张三", "语文", 58),
-> ("张三", "英语", 58),
-> ("李四", "数学", 45),
-> ("李四", "语文", 87),
-> ("李四", "英语", 45),
-> ("王五", "数学", 76),
-> ("王五", "语文", 34),
-> ("王五", "英语", 89);
查询表:
mysql> select * from test_tb_grade;
+----+-----------+--------+-------+
| ID | USER_NAME | COURSE | SCORE |
+----+-----------+--------+-------+
| 1 | 张三 | 数学 | 34 |
| 2 | 张三 | 语文 | 58 |
| 3 | 张三 | 英语 | 58 |
| 4 | 李四 | 数学 | 45 |
| 5 | 李四 | 语文 | 87 |
| 6 | 李四 | 英语 | 45 |
| 7 | 王五 | 数学 | 76 |
| 8 | 王五 | 语文 | 34 |
| 9 | 王五 | 英语 | 89 |
+----+-----------+--------+-------+
不用聚集函数和group by语句:
mysql> SELECT user_name ,
-> (CASE course WHEN '数学' THEN score ELSE 0 END ) 数学,
-> (CASE course WHEN '语文' THEN score ELSE 0 END ) 语文,
-> (CASE course WHEN '英语' THEN score ELSE 0 END ) 英语
-> FROM test_tb_grade;
+-----------+--------+--------+--------+
| user_name | 数学 | 语文 | 英语 |
+-----------+--------+--------+--------+
| 张三 | 34 | 0 | 0 |
| 张三 | 0 | 58 | 0 |
| 张三 | 0 | 0 | 58 |
| 李四 | 45 | 0 | 0 |
| 李四 | 0 | 87 | 0 |
| 李四 | 0 | 0 | 45 |
| 王五 | 76 | 0 | 0 |
| 王五 | 0 | 34 | 0 |
| 王五 | 0 | 0 | 89 |
+-----------+--------+--------+--------+
用group by语句:
mysql> SELECT user_name ,
-> (CASE course WHEN '数学' THEN score ELSE 0 END ) 数学,
-> (CASE course WHEN '语文' THEN score ELSE 0 END ) 语文,
-> (CASE course WHEN '英语' THEN score ELSE 0 END ) 英语
-> FROM test_tb_grade
-> group by user_name;
+-----------+--------+--------+--------+
| user_name | 数学 | 语文 | 英语 |
+-----------+--------+--------+--------+
| 张三 | 34 | 0 | 0 |
| 李四 | 45 | 0 | 0 |
| 王五 | 76 | 0 | 0 |
+-----------+--------+--------+--------+
用group by语句和聚集函数实现行转列:
mysql> SELECT user_name ,
-> MAX(CASE course WHEN '数学' THEN score ELSE 0 END ) 数学,
-> MAX(CASE course WHEN '语文' THEN score ELSE 0 END ) 语文,
-> MAX(CASE course WHEN '英语' THEN score ELSE 0 END ) 英语
-> FROM test_tb_grade
-> group by user_name;
+-----------+--------+--------+--------+
| user_name | 数学 | 语文 | 英语 |
+-----------+--------+--------+--------+
| 张三 | 34 | 58 | 58 |
| 李四 | 45 | 87 | 45 |
| 王五 | 76 | 34 | 89 |
+-----------+--------+--------+--------+
二、列转行——union
CREATE TABLE `TEST_TB_GRADE2` (
`ID` int(10) NOT NULL AUTO_INCREMENT,
`USER_NAME` varchar(20) DEFAULT NULL,
`CN_SCORE` float DEFAULT NULL,
`MATH_SCORE` float DEFAULT NULL,
`EN_SCORE` float DEFAULT '0',
PRIMARY KEY (`ID`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
插入数据:
insert into TEST_TB_GRADE2(USER_NAME, CN_SCORE, MATH_SCORE, EN_SCORE) values
("张三", 34, 58, 58),
("李四", 45, 87, 45),
("王五", 76, 34, 89);
查询:
mysql> select * from test_tb_grade2;
+----+-----------+----------+------------+----------+
| ID | USER_NAME | CN_SCORE | MATH_SCORE | EN_SCORE |
+----+-----------+----------+------------+----------+
| 1 | 张三 | 34 | 58 | 58 |
| 2 | 李四 | 45 | 87 | 45 |
| 3 | 王五 | 76 | 34 | 89 |
+----+-----------+----------+------------+----------+
不求并集:
mysql> select user_name, '语文' COURSE , CN_SCORE as SCORE from test_tb_grade2;
+-----------+--------+-------+
| user_name | COURSE | SCORE |
+-----------+--------+-------+
| 张三 | 语文 | 34 |
| 李四 | 语文 | 45 |
| 王五 | 语文 | 76 |
+-----------+--------+-------+
求并集:
mysql> select user_name, '语文' COURSE , CN_SCORE as SCORE from test_tb_grade2
-> union select user_name, '数学' COURSE, MATH_SCORE as SCORE from test_tb_grade2
-> union select user_name, '英语' COURSE, EN_SCORE as SCORE from test_tb_grade2;
+-----------+--------+-------+
| user_name | COURSE | SCORE |
+-----------+--------+-------+
| 张三 | 语文 | 34 |
| 李四 | 语文 | 45 |
| 王五 | 语文 | 76 |
| 张三 | 数学 | 58 |
| 李四 | 数学 | 87 |
| 王五 | 数学 | 34 |
| 张三 | 英语 | 58 |
| 李四 | 英语 | 45 |
| 王五 | 英语 | 89 |
+-----------+--------+-------+
order by语句:
mysql> select user_name, '语文' COURSE , CN_SCORE as SCORE from test_tb_grade2
-> union select user_name, '数学' COURSE, MATH_SCORE as SCORE from test_tb_grade2
-> union select user_name, '英语' COURSE, EN_SCORE as SCORE from test_tb_grade2
-> order by user_name,COURSE;
+-----------+--------+-------+
| user_name | COURSE | SCORE |
+-----------+--------+-------+
| 张三 | 数学 | 58 |
| 张三 | 英语 | 58 |
| 张三 | 语文 | 34 |
| 李四 | 数学 | 87 |
| 李四 | 英语 | 45 |
| 李四 | 语文 | 45 |
| 王五 | 数学 | 34 |
| 王五 | 英语 | 89 |
| 王五 | 语文 | 76 |
+-----------+--------+-------+
来源:https://blog.51cto.com/hiszm/5012221
0
投稿
猜你喜欢
- torch.argmax()函数解析1. 官网链接torch.argmax(),如下图所示:2. torch.argmax(input)函数
- 可实现类似于sql中的dateadd、datesub的功能两种获取日期的方式z=datetime.datetime(2016,12,5)z=
- 2个简单的代码,帮你实现word的导出和word的读取功能一:导出word,word中的内容为代码:from docx import Doc
- 使用 Beanstalkd 作为消息队列服务,然后结合 Python 的装饰器语法实现一个简单的异步任务处理工具.最终效果定义任务:from
- JQuery Solar System 是一个用JQuery写的东西,效果真是cool ! 没想到使用Javascript 也可以做到这种效
- 锁的概念①、锁,在现实生活中是为我们想要隐藏于外界所使用的一种工具。②、在计算机中,是协调多个进程或线程并发访问某一资源的一种机制。③、在数
- 本文为大家分享了pygame游戏之旅的第8篇,供大家参考,具体内容如下定义一个计数函数:def things_dodged(count):
- 在Python 3.5(含)以前,字典是不能保证顺序的,键值对A先插入字典,键值对B后插入字典,但是当你打印字典的Keys列表时,你会发现B
- Linux环境MySQL服务器级优化讲解 摘要:本节简单介绍了如何在服务器级优化数据库的性能
- 运行代码框<html><META HTTP-EQUIV="Content-Type" content=
- Python安装为什么默认安装到c盘?所有的软件如果你不对安装过程的路径进行设置的话都是默认安装到c盘的,不仅仅是Python。那安装到c盘
- 本文实例讲述了CentOS环境下安装Redis3.0及phpredis扩展测试。分享给大家供大家参考,具体如下:线上的统一聊天及推送系统re
- 任务通过输入的sin曲线与预测出对应的cos曲线#初始加载包 和定义参数import torchfrom torch import nnim
- 项目场景:在做目标检测时,重新进行标注会耗费大量的时间,如果能够批量对xml中的信息进行修改,那么将会节省大量的时间,接下来将详细介绍如何修
- 前言前一篇autoit实现文件上传打包成.exe可执行文件后,每次只能传固定的那个图片,我们实际测试时候希望传不同的图片。这样每次调用的时候
- 本文介绍了使用XMlhttp技术来生成html页面,值得借鉴。相关函数:<% ’定义xmlhttp funct
- 在IDLE下清屏:#网上有些先定义函数,再?print("\n" * 100)输出一百个换行的方法有点扯淡,跟连按回车没
- 今日大致浏览了一下《High Performance Web Sites》。本书的中文版是《高性能网站建设指南》。本书另有对其中个别问题深入
- 在训练模型时会在前面加上:model.train()在测试模型时在前面使用:model.eval()同时发现,如果不写这两个程序也可以运行,
- 我们在浏览网页的时候偶尔会遇到一些陌生的网页交互行为,通常情况下它们并不会影响你的正常使用,之所以出现情况往往是因为,设计师在设计某个交互方