標籤:
我的這篇文章整理了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,貼出來就不贅述了:
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;
我這裡用的是if不是case when,其實效果都差不多;
下面是更複雜點的衍生展現和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;
是不是感覺if函數很好用。。。有些領導就喜歡這種冗長的報表,順便說下:如果是大資料匯出這樣結構的資料,最好不要使用這個語句,如果資料量太大(10w),或者類似這樣的伴隨類別欄位(這裡科目是類別欄位)的延伸欄位(家長評價、社會評價、小校長評價)太多會是效能極速下降;
我測試解決大資料匯出這樣結構採用分頁匯出(帶排序欄位),並且每次分頁讀取時先緩衝一部分基本表的資訊,由於是帶排序的,所有緩衝的命中率很高;已經命中的清除緩衝,未命中的庫裡讀取這個記錄,並在此讀入一部分資訊到緩衝(細節以後單寫篇文章。。。)
mysql多行變多列(衍生形式)