学习mysql 如何行转列与列传行
作者:孙中明 时间:2024-01-17 05:45:01
一、行转列— 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
标签:mysql,行转列,列传行


猜你喜欢
c#编写的高并发数据库控制访问代码
2024-01-16 04:57:04
关于微信小程序获取小程序码并接受buffer流保存为图片的方法
2023-07-20 09:54:01
新手必备Python开发环境搭建教程
2023-07-09 03:25:35

Sql Server 数据库超时问题的解决方法
2009-01-13 14:11:00
Python+matplotlib绘制饼图和堆叠图
2022-11-17 05:42:40

pycharm使用技巧之自动调整代码格式总结
2021-08-28 08:13:18

Python对FTP交互封装的实现
2023-05-18 15:12:14
Python+Pygame实战之24点游戏的实现
2023-11-07 21:14:12

Python 如何批量更新已安装的库
2023-06-05 12:15:40

Python必备技能之debug调试教程详解
2023-03-01 19:26:10

python画图系列之个性化显示x轴区段文字的实例
2023-01-16 06:15:24

Python 实现12306登录功能实例代码
2021-04-07 08:55:35
mysql 5.7.13 解压缩版(免安装)安装配置教程
2024-01-24 01:13:28

关于WordPress的SEO优化相关的一些PHP页面脚本技巧
2024-06-05 09:39:16

详解Python查找谁删了你的微信
2021-01-02 02:32:02

如何利用python实现列表嵌套字典取值
2023-07-08 02:16:50
python利用matplotlib库绘制饼图的方法示例
2022-12-17 15:16:50

go语言实现猜数字小游戏的方法
2024-02-12 11:47:18
python字符串的index和find的区别详解
2022-09-17 17:58:47
Python算法中的时间复杂度问题
2021-03-20 04:52:50
