mysql行列轉換



檸檬班的Linux、MySQL、Java成績保存在數據表 tb_lemon_grade中,

表中字段id,student_name,course,score分別表示id,學生姓名,課程名稱,課程成績
請:行列轉換,從圖1轉換成最后一張圖的數據

一:創建表

drop table if exists tb_lemon_grade;
CREATE TABLE tb_lemon_grade (
id INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,
student_name VARCHAR(20) DEFAULT NULL,
course VARCHAR(20) DEFAULT NULL,
score FLOAT DEFAULT '0'
) engine=INNODB default charset=utf8;

 

 

二:初始化數據

INSERT INTO tb_lemon_grade (student_name, course, score) VALUES
("張三", "Linux", 85),("張三", "MySQL", 92),("張三", "Java", 87),("李四", "Linux", 96),
("李四", "MySQL", 89),("李四", "Java", 100),("王五", "Linux", 91),("王五", "MySQL", 83),("王五", "Java", 98);

 


三:首先我們查詢出所有數據,這個結果和我們的圖1是一樣的

select * from tb_lemon_grade;

 




四:使用常量列輸出我們的目標結構

可以看到結果已經和我們的圖二非常接近了

select student_name,0 'Linux', 0 'MySQL', 0 'score'  from tb_lemon_grade;

 


五:使用IF函數,替換我們的常量列,將成績賦值到對應行的對應列

select student_name, 
if(course='Linux', score, 0) 'Linux',
if(course='MySQL', score, 0) 'MySQL',
if(course='java', score, 0) 'java'
from tb_lemon_grade;

 

運行SQL,結果如下所示:

六:我們來分析這個結果集,

在原始結構中,每一行表示了某個同學某一個科的成績,以第一行為例,第一行是張三同學Linux的成績,所以我們結果集中Linux有成績為85,而其他兩列MySQL和Java作為常量列,成績為0。

再分析每個同學的成績的所有行,如下圖所示,每個方塊內包含行中,就有該同學這門課程的成績,並且該方塊內其余行的成績值為0。因此,不難想到,我們可以使用分組,通過分組提取出每科的成績

七:分組,使用MAX函數取出最大值

(因為其中只有一行成績為真實成績,其他行值為0,所以最大值就是真實成績)

select student_name,
max(if(course='Linux', score, 0)) 'Linux',
max(if(course='MySQL', score, 0)) 'MySQL',
max(if(course='java', score, 0)) 'java'
from tb_lemon_grade
group by student_name;

 



八:也可以分組后,對每行數據進行求和,使用SUM函數,語句和結果如下:

select student_name,
sum(if(course='Linux', score, 0)) 'Linux',
sum(if(course='MySQL', score, 0)) 'MySQL',
sum(if(course='java', score, 0)) 'java'
from tb_lemon_grade
group by student_name;

 



九:既然使用IF語句可以達到效果,那使用CASE語句也是同樣的效果

分組,使用MAX聚合函數

select student_name,
max( case course when 'Linux' then score else 0 end) 'Linux',
max(case course when 'MySQL' then score else 0 end) 'MySQL',
max(case course when 'java' then score else 0 end)  'java'
from tb_lemon_grade
group by student_name;

 


結果如下圖所示:

使用SUM,結果如下圖所示

select student_name,
sum( case course when 'Linux' then score else 0 end) 'Linux',
sum(case course when 'MySQL' then score else 0 end) 'MySQL',
sum(case course when 'java' then score else 0 end)  'java'
from tb_lemon_grade
group by student_name;

 



總結:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM