-
2021-01-19 16:35:42
1. 创建表:
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 |
+-----------+--------+--------+--------+
2. 创建表:
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 |
+-----------+--------+-------+
更多相关内容 -
mysql 行转列和列转行实例详解
2020-12-16 00:11:46mysql行转列、列转行 语句不难,不做多余解释了,看语句时,从内往外一句一句剖析 行转列 有如图所示的表,现在希望查询的结果将行转成列 建表语句如下: CREATE TABLE `TEST_TB_GRADE` ( `ID` int(10) NOT... -
Mysql 行转列,列转行 SQL语句和示例表结构SQL
2018-04-09 10:10:17Mysql 行转列,列转行 SQL语句和示例表结构SQL Mysql 行转列,列转行 SQL语句和示例表结构SQL -
oracle列转行和行转列的几种用法x_mysql行转列和列转行
2020-09-14 14:14:21PAGE / NUMPAGES 列转行 主要讨论sys_connect_by_path的使用方法 1带层次关系 SQL> create table dept(deptno number,deptname varchar2(20,mgrno number;文档收集自网络仅用于个人学习 Table created. SQL> insert ... -
mysql 列转行,合并字段的方法(必看)
2020-12-16 04:51:46列转行:利用max(case when then) max—聚合函数 取最大值 (case course when ‘语文’ then score else 0 end) —判断 as 语文—别名作为列名 SELECT `name`, MAX( CASE WHEN course='\u8bed\u6587' THEN ... -
mysql列转行以及年月分组实例
2020-09-09 18:24:31下面小编就为大家带来一篇mysql列转行以及年月分组实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧 -
SQL行转列、列转行的简单实现
2020-09-09 03:51:30主要给大家介绍了关于SQL行转列、列转行的简单实现方法,文中通过示例代码介绍的非常详细,对大家学习或者使用SQL具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧 -
mysql行转列和列转行
2022-01-06 17:45:42mysql行转列和列转行行转列
1、初始数据
2、行转列后的数据
3、sql语句
select name, max(CASE type WHEN '语文' THEN score.score else 0 END) '语文', max(CASE type WHEN '数学' THEN score.score else 0 END) '数学', max(CASE type WHEN '英语' THEN score.score else 0 END) '英语' from score GROUP BY name;
这里使用max函数的原因是因为group by分组,没有max函数的话 他就会查询每个分组的第一个元组,所以max函数是不能少的。
列转行
1、初始数据
2、列转行后的数据
3、sql语句
select id,name, '语文' as course, chinese as score from score01 UNION ALL select id,name, '数学' as course, math as score from score01 UNION ALL select id,name, '英语' as course, english as score from score01 order by id
全部sql
==============================================行转列============================================== CREATE TABLE `score` ( `id` int NOT NULL AUTO_INCREMENT, `name` varchar(255) DEFAULT NULL, `type` varchar(255) DEFAULT NULL, `score` int DEFAULT NULL, PRIMARY KEY (`id`) ); INSERT into score VALUES(1,'张三','语文',70); INSERT into score VALUES(2,'张三','数学',80); INSERT into score VALUES(3,'张三','英语',90); INSERT into score VALUES(4,'李四','语文',50); INSERT into score VALUES(5,'李四','数学',60); INSERT into score VALUES(6,'李四','英语',80); INSERT into score VALUES(7,'王五','语文',60); INSERT into score VALUES(8,'王五','数学',90); INSERT into score VALUES(9,'王五','英语',80); select * from score; select name, max(CASE type WHEN '语文' THEN score.score else 0 END) '语文', max(CASE type WHEN '数学' THEN score.score else 0 END) '数学', max(CASE type WHEN '英语' THEN score.score else 0 END) '英语' from score GROUP BY name; ==============================================列转行============================================== CREATE TABLE `score01` ( `id` int NOT NULL, `name` varchar(255) DEFAULT NULL, `chinese` int DEFAULT NULL, `math` int DEFAULT NULL, `english` int DEFAULT NULL, PRIMARY KEY (`id`) ); INSERT INTO score01 VALUES(1,'张三',50,60,70); INSERT INTO score01 VALUES(2,'李四',80,60,50); INSERT INTO score01 VALUES(3,'王五',80,70,60); select * from score01; select id,name, '语文' as course, chinese as score from score01 UNION ALL select id,name, '数学' as course, math as score from score01 UNION ALL select id,name, '英语' as course, english as score from score01 order by id;
-
MySQL 行转列与列转行
2022-03-16 11:15:15一、行转列 数据准备 建表: CREATE TABLE `student` ( `ID` int(10) NOT NULL AUTO_INCREMENT, `USER_NAME` varchar(20) DEFAULT NULL, `COURSE` varchar(20) DEFAULT NULL, `SCORE` float DEFAULT '0', ...一、行转列
数据准备
建表:
CREATE TABLE `student` ( `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=10 DEFAULT CHARSET=utf8;
新增数据:
insert into student(USER_NAME, COURSE, SCORE) values ("张三", "数学", 34), ("张三", "语文", 58), ("张三", "英语", 58), ("李四", "数学", 45), ("李四", "语文", 87), ("李四", "英语", 45), ("王五", "数学", 76), ("王五", "语文", 34), ("王五", "英语", 89);
源数据:
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 student GROUP BY USER_NAME;
行转列后:
二、列转行
数据准备
建表:
CREATE TABLE `grade` ( `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 grade(USER_NAME, CN_SCORE, MATH_SCORE, EN_SCORE) values ("张三", 34, 58, 58), ("李四", 45, 87, 45), ("王五", 76, 34, 89);
源数据:
select user_name, '语文' COURSE , CN_SCORE as SCORE from grade union select user_name, '数学' COURSE, MATH_SCORE as SCORE from grade union select user_name, '英语' COURSE, EN_SCORE as SCORE from grade order by user_name,COURSE;
列转行后:
-
Mysql 行转列、列转行
2022-05-11 14:09:02Mysql 行转列、列转行1. 行转列
建表语句
CREATE table student(
id int(8) primary key auto_increment,
name varchar(50) default null comment '姓名',
subject varchar(20) default null comment '科目',
score double default 0 comment '分数'
);测试数据
INSERT into student (name,subject,score) values ('张三','语文',99);
INSERT into student (name,subject,score) values ('张三','数学',100);
INSERT into student (name,subject,score) values ('张三','英语',87);
INSERT into student (name,subject,score) values ('李四','语文',89);
INSERT into student (name,subject,score) values ('李四','数学',97);
INSERT into student (name,subject,score) values ('李四','英语',88);原始数据查询
SELECT * from student ;
行转列SQL语句:
SELECT name , MAX(CASE subject when '语文' then score else 0 end) as '语文', MAX(CASE subject when '数学' then score else 0 end) as '数学', MAX(CASE subject when '英语' then score else 0 end) as '英语' FROM student group by name;
2. 列转行
建表语句
CREATE table student2(
id int(8) primary key auto_increment,
name varchar(50) default null comment '姓名',
subject1 varchar(20) default null comment '语文',
subject2 varchar(20) default null comment '英语',
subject3 varchar(20) default null comment '英语'
);测试数据
insert into student2 (name,subject1,subject2,subject3) values('张三','99','100','87');
insert into student2 (name,subject1,subject2,subject3) values('李四','89','97','88');原始数据查询
SELECT * from student2 ;
列转行SQL语句:
两种方式:
SELECT name,'语文' as subject , subject1 as score from student2
UNION
SELECT name,'数学' as subject , subject2 as score from student2
UNION
SELECT name,'英语' as subject , subject3 as score from student2
order by name ;或
SELECT
name ,
'语文' as subject,
MAX(subject1) as score
from
student2
group by
name
UNION
SELECT
name ,
'数学' as subject,
MAX(subject2) as score
from
student2
group by
name
UNION
SELECT
name ,
'英语' as subject,
MAX(subject3) as score
from
student2
group by
name
ORDER BY
name ; -
mysql行转列、列转行示例
2021-01-28 06:52:53最近在开发过程中遇到问题,需要将数据库中一张表信息进行行转列操作,再将每列(即每个字段)作为与其他表进行联表查询的字段进行显示。借此机会,在网上查阅了相关方法,现总结出一种比较简单易懂的方法备用。一、行... -
MySql行转列&列转行
2022-01-09 15:26:38行转列: 创建语句: create table test1( id int auto_increment primary key , name varchar(255), course varchar(255), score int ) insert into test1(name,course,score) values ('张三','语文',120); insert... -
mysql行转列(将同一列下的不同内容的几行数据,转换成几列显示)、列转行、行列汇总、合并显示
2019-09-03 11:47:37mysql行转列(将同一列下的不同内容的几行数据,转换成几列显示)、列转行、行列汇总、合并显示 -
MySQL中的列转行和行转列
2022-04-05 23:27:56在学习sql中遇到了列转行和行转列的题目,这里总结一下如何在对应的情景下解决不同的题目; 列转行 创建一个表stu_score_01: SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS = 0; -- ---------------------------- --... -
MySQL 中行转列的方法
2021-01-19 21:39:10MySQL行转列操作 所谓的行转列操作,就是将一个表的行信息转化为列信息,说着可能比较笼统,这里先举个例子,如下: +----+-----------+--------+-------+ | ID | USER_NAME | COURSE | SCORE | +----+----------... -
mysql-行转列、列转行
2019-08-12 01:36:33NULL 博文链接:https://x125858805.iteye.com/blog/2273503 -
MySQL行转列与列转行
2021-01-18 18:27:52行转列数据准备建表:CREATE TABLE `student` (`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`)) ... -
mysql数据行转列,列转行
2021-11-17 11:23:29行转列 使用union,一行变多行 select temp.uid, temp.column from ( select uid, column1 as column from base_table union select uid, column2 as column from base_table ) temp 列转行 select temp.... -
mysql行转列、列转行
2022-04-24 16:06:00行转列 如下图,有一张成绩表“TEST_TB_GRADE”,每位同学有多个成绩,因此每个同学有多条记录,现想将每位同学的所有成绩展示在同一行上,实现过程如下: 建表语句如下: CREATE TABLE `TEST_TB_GRADE` ( `... -
mysql 列转行的技巧(分享)
2020-09-09 18:23:37下面小编就为大家带来一篇mysql 列转行的技巧(分享)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧 -
mysql 行转列查询、列转行查询
2022-05-30 18:49:16mysql 行转列查询、列转行查询 -
mySql 行转列 列转行 case when
2021-02-06 19:49:19-- 行转列 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 ) ... -
MYSQL 行转列、列转行、多列转一行、一行转多列
2022-06-10 10:55:56版本说明mysql8.0selectname,max(case subject when '语文' then resuilt else 0 end) '语文',max(case subject when '数学' then resuilt else 0 end) '数学',max(case subject when '物理' then resuilt else 0 ... -
【MySQL】SQL行转列和列转行
2022-01-27 17:33:17SQL关键字:行转列【union】;列转行【case ...when...then】