http://blog.csdn.net/sinat_27406925/article/details/77507478

mysql 行列转换 ,在项目中应用的极其频繁,尤其是一些金融项目里的报表。其中最为头痛的就是多行转多列,动态的列行转换。最近在研究这些行里转换,还是从最为简单的行列转换开始。

sql 脚本

-- 创建表  学生表
CREATE TABLE `student` (`stuid` VARCHAR(16) NOT NULL COMMENT '学号',`stunm` VARCHAR(20) NOT NULL COMMENT '学生姓名',PRIMARY KEY (`stuid`)
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB; -- 课程表 CREATE TABLE `courses` (`courseno` VARCHAR(20) NOT NULL,`coursenm` VARCHAR(100) NOT NULL,PRIMARY KEY (`courseno`)
)
COMMENT='课程表'
COLLATE='utf8_general_ci'
ENGINE=InnoDB;-- 成绩表
CREATE TABLE `score` (`stuid` VARCHAR(16) NOT NULL,`courseno` VARCHAR(20) NOT NULL,`scores` FLOAT NULL DEFAULT NULL,PRIMARY KEY (`stuid`, `courseno`)
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB;-- 插入数据-- 学生表数据Insert Into student (stuid, stunm) Values('1001', '张三');
Insert Into student (stuid, stunm) Values('1002', '李四');
Insert Into student (stuid, stunm) Values('1003', '赵二');
Insert Into student (stuid, stunm) Values('1004', '王五');
Insert Into student (stuid, stunm) Values('1005', '刘青');
Insert Into student (stuid, stunm) Values('1006', '周明');-- 课程表数据
Insert Into courses (courseno, coursenm) Values('C001', '大学语文');
Insert Into courses (courseno, coursenm) Values('C002', '新视野英语');
Insert Into courses (courseno, coursenm) Values('C003', '离散数学');
Insert Into courses (courseno, coursenm) Values('C004', '概率论与数理统计');
Insert Into courses (courseno, coursenm) Values('C005', '线性代数');
Insert Into courses (courseno, coursenm) Values('C006', '高等数学(一)');
Insert Into courses (courseno, coursenm) Values('C007', '高等数学(二)');-- 成绩表数据Insert Into score(stuid, courseno, scores) Values('1001', 'C001', 67);
Insert Into score(stuid, courseno, scores) Values('1002', 'C001', 68);
Insert Into score(stuid, courseno, scores) Values('1003', 'C001', 69);
Insert Into score(stuid, courseno, scores) Values('1004', 'C001', 70);
Insert Into score(stuid, courseno, scores) Values('1005', 'C001', 71);
Insert Into score(stuid, courseno, scores) Values('1006', 'C001', 72);
Insert Into score(stuid, courseno, scores) Values('1001', 'C002', 87);
Insert Into score(stuid, courseno, scores) Values('1002', 'C002', 88);
Insert Into score(stuid, courseno, scores) Values('1003', 'C002', 89);
Insert Into score(stuid, courseno, scores) Values('1004', 'C002', 90);
Insert Into score(stuid, courseno, scores) Values('1005', 'C002', 91);
Insert Into score(stuid, courseno, scores) Values('1006', 'C002', 92);
Insert Into score(stuid, courseno, scores) Values('1001', 'C003', 83);
Insert Into score(stuid, courseno, scores) Values('1002', 'C003', 84);
Insert Into score(stuid, courseno, scores) Values('1003', 'C003', 85);
Insert Into score(stuid, courseno, scores) Values('1004', 'C003', 86);
Insert Into score(stuid, courseno, scores) Values('1005', 'C003', 87);
Insert Into score(stuid, courseno, scores) Values('1006', 'C003', 88);
Insert Into score(stuid, courseno, scores) Values('1001', 'C004', 88);
Insert Into score(stuid, courseno, scores) Values('1002', 'C004', 89);
Insert Into score(stuid, courseno, scores) Values('1003', 'C004', 90);
Insert Into score(stuid, courseno, scores) Values('1004', 'C004', 91);
Insert Into score(stuid, courseno, scores) Values('1005', 'C004', 92);
Insert Into score(stuid, courseno, scores) Values('1006', 'C004', 93);
Insert Into score(stuid, courseno, scores) Values('1001', 'C005', 77);
Insert Into score(stuid, courseno, scores) Values('1002', 'C005', 78);
Insert Into score(stuid, courseno, scores) Values('1003', 'C005', 79);--
select st.stuid,st.stunm  from student  st select sc.stuid , sc.courseno,sc.scores  from score sc select  cs.courseno,cs.coursenm   from courses cs

要求: 查询每个学生的 每门课程与每门成绩

 select   st.stuid ID ,  st.stunm 姓名, cs.coursenm 课程名 ,sc.scores 成绩     from  student st, score sc ,courses cswhere st.stuid = sc.stuid and sc.courseno = cs.courseno  

结果: 

这是4列27行

我们行转成列,ID对应姓名对应每门课程对应每门成绩

静态行专列

 select st.stuid 编号, st.stunm 姓名 ,
Max(case c.coursenm when '大学语文' then s.scores else 0 end ) '大学语文',
max(case c.coursenm when '新视野英语' then IFNULL(s.scores,0)else 0 end) '新视野英语',
Max(case c.coursenm when '离散数学' then IFNULL(s.scores,0) ELSE 0 END) '离散数学',
MAX(case c.coursenm when '概率论与数理统计' then IFNULL(s.scores,0) else 0 end) '概率论与数理统计',
MAX(case c.coursenm  when '线性代数' then IFNULL(s.scores,0) else 0 END) '线性代数',
MAX(case c.coursenm when '高等数学(一)' THEN IFNULL(s.scores,0) else 0 end) '高等数学(一)',
MAX(case c.coursenm when '高等数学(二)' THEN IFNULL(s.scores,0) else 0 end) '高等数学(二)'
from  student st
LEFT JOIN score s on st.stuid = s.stuid
LEFT JOIN courses c on c.courseno = s.courseno
GROUP BY st.stuid

再来看看 运行结果:

这就是实现了简单的行列

再来看看group_concat() 这个函数

group_concat(),手册上说明:该函数返回带有来自一个组的连接的非NULL值的字符串结果。 
比较抽象,难以理解。

通俗点理解,其实是这样的:group_concat()会计算哪些行属于同一组,将属于同一组的列显示出来。要返回哪些列,由函

数参数(就是字段名)决定。分组必须有个标准,就是根据group by指定的列进行分组。

这些都是从网上看到的解释,但还是不好理解,我们直接上代码,看看run出来的结果,根据run之后的结果再回过来看!

select   s.stuid 编号 , GROUP_CONCAT(courseno) 课程号 , GROUP_CONCAT(s.scores)  成绩  from score s GROUP BY  s.stuid

看看运行后的结果: 
之前效果:

非常明显GROUP_CONCAT() 作用 ,将课程号courseno, 成绩 scores 的结果集放在一起。

mysql行转列转换相关推荐

  1. mysql中将列动态转换为行,mysql 行转列 MySQL数据库动态行转列

    想把mysql一个表的行转成列,图1是原表,想实现图2的样式SELECT MAX(CAS就是一个动态的行列转换 CREATE TABLE `c_wssb_zz` ( `aa011` varchar(1 ...

  2. mysql行转列和列转行_mysql 行转列和列转行实例详解

    mysql行转列.列转行 语句不难,不做多余解释了,看语句时,从内往外一句一句剖析 行转列 有如图所示的表,现在希望查询的结果将行转成列 建表语句如下: create table `test_tb_g ...

  3. mysql行转列sql函数_sql动态行转列的两种方法

    第一种方法: 代码如下: select *from ( select Url,case  when  Month=01 then  '1月' when  Month=02 then '2月' when ...

  4. 5分钟搞懂MySQL - 行转列

    小伙伴想精准查找自己想看的MySQL文章?喏 → MySQL专栏目录 | 点击这里 MySQL行转列,对经常处理数据的同学们来说,一定是不陌生的,甚至是印象深刻,因为它大概率困扰过你,让你为之一愣~ ...

  5. mysql行转列transform_MySQL学习之行列转换案例

    前言 Oracle中的pivot/unpivot函数可以很方便的帮助我们实现行列转换,但是MySQL并不支持. 可以在SQL上想办法,比如pivot考虑用聚合函数+case when, unpiovt ...

  6. mysql 行转列查询优化_行转列及列转行查询

    开发过程中常遇到行转列或是列转行的问题,即需要将数据库中一张表信息进行行转列操作,再将每列(即每个字段)作为与其他表进行联表查询的字段进行显示. 一.行转列:将原来同一列下多行的不同内容作为多个字段, ...

  7. MySQL行转列与列转行

    行转列 例如:把图1转换成图2结果展示 图1 图2 CREATE TABLE `TEST_TB_GRADE` (`ID` int(10) NOT NULL AUTO_INCREMENT,`USER_N ...

  8. mysql 行转列分级输出_MySQL如何实现行转列分级输出?_MySQL

    概述 好久没写SQL语句,今天看到问答中的一个问题,拿来研究一下. 问题链接:关于Mysql 的分级输出问题 情景简介 学校里面记录成绩,每个人的选课不一样,而且以后会添加课程,所以不需要把所有课程当 ...

  9. DLA SQL技巧:行、列转换和JSON数据列展开

    1. 简介 在数据库SQL处理中,常常有行转列(Pivot)和列转行(Unpivot)的数据处理需求.本文以示例说明在Data Lake Analytics中,如何使用SQL的一些技巧,达到行转列(P ...

  10. mysql行转列和列转行_Mysql中行转列和列转行

    一.行转列 即将原本同一列下多行的不同内容作为多个字段,输出对应内容. 建表语句 DROP TABLE IF EXISTS tb_score; CREATE TABLE tb_score( id IN ...

最新文章

  1. linux下apache+php+mysql升级安装过程
  2. php 昨天开始时间_php日期处理显示:昨天、今天、本周、上一月等时间结点数据...
  3. 03-cmake语法-变量,字符串
  4. 125. Valid Palindrome
  5. 简单工厂抽象工厂工厂方法_让工厂美丽
  6. docker 学习记录
  7. 开源日志库log4cplus+VS2008使用整理
  8. Nginx前端设置反向代理,后端Apache如何获取访客的真实IP,结合PHP
  9. AS3学习笔记(一)基础知识
  10. Mac上设置图片或视频的默认打开软件的方法
  11. python实现Pandas电话数据分析
  12. 财务审计工具箱 audtool 数据处理分析必备工具
  13. 计算机及移动设备管理软件,终端管理软件
  14. 华为静态,动态NAT,Easy IP实验!超详细,有手就能学会
  15. 用ENSP配置ospf
  16. mysql aix版本查看_AIX 查看aio状态
  17. 一步一步学习DVWA渗透测试(CSP Bypass绕过内容安全策略)-第十二次课
  18. matlab收获,matlab实习心得体会 1700字
  19. dubbo核心源码流程分析
  20. 服务器操作系统linux,关于服务器的操作系统

热门文章

  1. 巧用“搜索”解决自学编程遇到的难题
  2. Meteor的工作原理及优势与不足
  3. 37线性映射04——像与核、核与像的计算、线性映射的维数公式
  4. Python—什么是duck type鸭子类型
  5. 快速排序 Vs. 归并排序 Vs. 堆排序——谁才是最强的排序算法
  6. Django项目实践2 - Django模板语言(常用语法规则)
  7. 数据结构和算法liuyubobo_C++,java算法与数据结构-某课网价值166元实战教程
  8. Java String、StringBuffer、StringBuilder区别
  9. Deep Learning ——Yann LeCun,Yoshua BengioGeoffrey Hinton
  10. 视图,触发器,事务,存储过程,函数与流程控制,索引