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;

insert into TEST_TB_GRADE(USER_NAME, COURSE, SCORE) values
("张三", "数学", 34),
("张三", "语文", 58),
("张三", "英语", 58),
("李四", "数学", 45),
("李四", "语文", 87),
("李四", "英语", 45),
("王五", "数学", 76),
("王五", "语文", 34),
("王五", "英语", 89);

查询语句:

  此处用之所以用MAX是为了将无数据的点设为0,防止出现NULL

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;

结果展示:

二、列转行

有如图所示的表,现在希望查询的结果将列成行

建表语句如下:

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

查询语句:

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;

结果展示:

原文地址:https://www.cnblogs.com/hzh-java/p/10640750.html

时间: 2024-10-09 07:01:32

MySQL查询结果行转列、列转行的相关文章

MySQL 如何实现行转列分级输出?

概述 好久没写SQL语句,今天看到问答中的一个问题,拿来研究一下. 问题链接:关于Mysql 的分级输出问题 情景简介 学校里面记录成绩,每个人的选课不一样,而且以后会添加课程,所以不需要把所有课程当作列.数据表里面数据如下图,使用姓名+课程作为联合主键(有些需求可能不需要联合主键).本文以MySQL为基础,其他数据库会有些许语法不同. 数据库表数据: 处理后的结果(行转列): 方法一: 这里可以使用Max,也可以使用Sum: 注意第二张图,当有学生的某科成绩缺失的时候,输出结果为Null; 

数据库 行转列 列转行详解

目录结构如下: 行转列 列转行 [一].行转列 1.1.初始测试数据 表结构:TEST_TB_GRADE create table TEST_TB_GRADE ( ID        NUMBER(10) not null, USER_NAME VARCHAR2(20 CHAR), COURSE    VARCHAR2(20 CHAR), SCORE     FLOAT ) [sql] view plaincopy create table TEST_TB_GRADE ( ID        N

Sql server 中将数据行转列列转行(二)

老规矩,先弄一波测试数据,数据填充代码没有什么意义,先折叠起来: /* 第一步:创建临时表结构 */ CREATE TABLE #Student --创建临时表 ( StuName nvarchar(20), --学生名称 Chinese int, Math int, English int ) DROP TABLE #Student --删除临时表 SELECT * FROM #Student --查询所有数据 INSERT INTO #Student(StuName,Chinese,Math

MSSQLServer 纵向表转横向表 横向表转纵向表 行转列 列转行

MSSQLServer 纵向表转横向表  横向表转纵向表 建表语句及插入数据语句: CREATE TABLE Test_y( [Name] [nchar](10) NULL, [Course] [nchar](10) NULL, [Grade] [int] NULL ) insert into Test_y values ('张三','语文',75); insert into Test_y values ('张三','数学',80); insert into Test_y values ('张三

SQL查询语句行转列横向显示

SQL查询语句行转列横向显示 2011-03-15 10:00:14|  分类: sql |  标签:resource   |举报 |字号大中小 订阅 在SQL查询语句行转列横向显示中access中没有CASE,要用IIF代替 select  iif(sex= '1 ', '男 ', '女 ')  from  tablename 示例1: select country, sum(case when type='A' then money end) as A, sum(case when type

mysql多行变多列(衍生形式)

我的这篇文章整理了mysql多行变多列的2种常见形式:http://blog.csdn.net/rainyspring4540/article/details/50231435 这里就不赘述了,下面说下它更复杂的衍生形式: 表结构: create table student ( name varchar(20) not null, -- 姓名 course varchar(20) not null,-- 科目 score int ,-- 成绩 bossEvaluate varchar(20),-

mysql 多行合并一列

mysql  多行合并一列 使用的函数为: GROUP_CONCAT(exp) 其中exp 的参数类似如下: (field order  by field   desc  separator ';'); 具体的例子如下: 创建表: CREATE TABLE `login` ( `Id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(255) DEFAULT NULL, PRIMARY KEY (`Id`) ) ENGINE=MyISAM AUTO

mysql查询结果多列拼接查询

mysql查询结果多列拼接查询,主要场景是,列表中其中一列涉及另外一张表的多条数据,但是我只需要多条数据中的其中某一列(主子表场景) 关键字:GROUP_CONCAT sql语句如下: SELECT r.id,b.NAME AS group_name,GROUP_CONCAT( a.`name` ) province_name FROM config_rule AS r LEFT JOIN group AS g ON ( r.svg_id = g.id ) LEFT JOIN config_ru

Oracle 多行变一列的方法

多行变一列的方法有很多,觉得这个第一眼看懂了当时就用的这个办法. 情况是这样的.以下数据前几列是一样的,需要把VAT_VALUE_CHAR 的值放在同一行上. SELECT * FROM ps_vat_defaults defaults WHERE defaults.vat_driver = 'VAT_ENT_RGSTRN' AND defaults.vat_driver_key1 = 'AMB19' AND defaults.vat_driver_key2 = 'DEU' AND vat_de