时间:2021-07-01 10:21:17 帮助过:2人阅读
我的这篇文章整理了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),-- 校长评估
- familyEvaluate varchar(20),-- 家族评估
- societyEvaluate varchar(20), -- 社会评估
- primary key(name,course)
- );
- insert into student values('小王','数学','10','A','B','C');
- insert into student values('小王','语文','20','A','B','C');
- insert into student values('小王','英语','30','A','B','C');
- insert into student values('小花','数学','10','A','A','A');
- insert into student values('小花','语文','40','A','A','C');
- insert into student values('小花','英语','10','A','B','C');
- insert into student values('小虎','数学','25','C','B','C');
- insert into student values('小虎','语文','10','A','C','C');
- insert into student values('小虎','英语','10','A','B','C');
下面的是一般的生成展现和sql,贴出来就不赘述了:
我这里用的是if不是case when,其实效果都差不多;
- SELECT name ,max(if(course='数学',score,0)) as '数学' ,max(if(course='语文',score,0)) as '语文' ,max(if(course='英语',score,0)) as '英语'
- FROM ds_wjytest2.student group by name;
下面是更复杂点的衍生展现和sql:
- SELECT name ,
- max(if(course='数学',score,0)) as '数学' ,max(if(course='数学',bossEvaluate,null)) as '校长评估' ,max(if(course='数学',familyEvaluate,null)) as '家族评估' ,max(if(course='数学',societyEvaluate,null)) as '社会评估',
- max(if(course='语文',score,0)) as '语文' ,max(if(course='语文',bossEvaluate,null)) as '校长评估' ,max(if(course='语文',familyEvaluate,null)) as '家族评估' ,max(if(course='语文',societyEvaluate,null)) as '社会评估',
- max(if(course='英语',score,0)) as '英语' ,max(if(course='英语',bossEvaluate,null)) as '校长评估',max(if(course='英语',familyEvaluate,null)) as '家族评估' ,max(if(course='英语',societyEvaluate,null)) as '社会评估'
- FROM ds_wjytest2.student group by name;
我测试解决大数据导出这样结构采用分页导出(带排序字段),并且每次分页读取时先缓存一部分基本表的信息,由于是带排序的,所有缓存的命中率很高;已经命中的清除缓存,未命中的库里读取这个记录,并在此读入一部分信息到缓存(细节以后单写篇文章。。。)
mysql多行变多列(衍生形式)
标签: