mysql行轉列解析

2021-09-24 21:10:28 字數 3042 閱讀 8170

場景:mysq行列轉換,把個人和科目成績的情況放在一行展示,方便檢視個人情況。(sql來說就是把乙個重複列以及其對應關係的列,變成一行展示)

sql測試語句

drop table if exists `t_score`;

create table `t_score` (

`id` int(11) not null auto_increment,

`name` varchar(20) character set utf8 not null,

`subject` varchar(10) character set utf8 not null,

`fraction` double default '0',

primary key (`id`)

) engine=innodb auto_increment=14 default charset=latin1;

-- ----------------------------

-- records of t_score

-- ----------------------------

insert into `t_score` values ('1', '王海', '語文', '86');

insert into `t_score` values ('2', '王海', '數學', '83');

insert into `t_score` values ('3', '王海', '英語', '93');

insert into `t_score` values ('4', '陶俊', '語文', '88');

insert into `t_score` values ('5', '陶俊', '數學', '84');

insert into `t_score` values ('6', '陶俊', '英語', '94');

insert into `t_score` values ('7', '劉可', '語文', '80');

insert into `t_score` values ('8', '劉可', '數學', '86');

insert into `t_score` values ('9', '劉可', '英語', '88');

insert into `t_score` values ('10', '李春', '語文', '89');

insert into `t_score` values ('11', '李春', '數學', '80');

insert into `t_score` values ('12', '李春', '英語', '87');

insert into `t_score` values ('13', '王海', '物理', '4');

這樣寫轉換sql

select 

`name`,

sum(if(subject='語文',fraction,0)) as 語文,

sum(if(subject='英語',fraction,0)) as 英語,

sum(if(subject='數學',fraction,0))as 數學

from t_score group by name ;

先展示資料

轉換邏輯分析,sql先根據group by name分組,比如王海分組後是

1.name:王海,subject 合併,fraction合併

2.if(subject='語文',fraction,0)  遍歷。subject 判斷當前科目是不是語文,等於的話輸出fraction對應的值,不等於的話輸出0

以語文為例,語文與王海的其他科目相比,按順序:語文與語文,語文與數學,語文與英語,語文與物理

依次為86,0,0,0

3.sum(if(subject='語文',fraction,0)) as 語文, 然後把所有的結果相加等於 86

4.所以就會有這樣的情況

(1)比如語文有多個

結果為,86,0,0,4   所以相加為90

(2)sum(if(subject='語文',fraction,1000))不存在預設為1000  會導致正常結果增加

select 

`name`,

sum(if(subject='語文',fraction,1000)) as 語文,

sum(if(subject='英語',fraction,0)) as 英語,

sum(if(subject='數學',fraction,0))as 數學

from t_score group by name ;

結果:語文都增加了2000

分析,王海的,語文與語文,語文與數學,語文與英語,語文語文   結果為 86,1000,1000,4  所以相加2090  

mysql 動態行轉列 MySQL行轉列

比如乙個單子,多個收據單用逗號隔開,怎麼把這乙個單子所有收據單獨展示出來,行轉成列呢?方法一 這裡需要用到迴圈,首先建立乙個1 10的序列 select rownum rownum 1 as seq from select rownum 0 r,bills limit 0,10 其次依次運用 sub...

mysql行轉列 subs mysql 行轉列

存在表score,記錄學生的考試成績,如下圖所示 現要求以 學生姓名,語文,數學,英語 這種格式顯示學生成績,如下圖所示 具體步驟如下 1 首先,使用case when函式輸出單個課程的成績 case when course 語文 then score end as 語文 case when cou...

mysql行轉列怎麼用 mysql錶行轉列的用法

現在有一張score表,儲存學生每門課的成績,結構資料如下 idnamesubjectscore 1張三 語文90 2張三 數學88 3張三 外語75 4李四 語文99 5李四 數學70 6李四 外語95 7李五 語文88 8李五 數學85 9李五 外語90 現在要求列出每個學生所有課程的成績.這就...