MySql行轉(zhuǎn)列&列轉(zhuǎn)行方式
MySql行轉(zhuǎn)列&列轉(zhuǎn)行
行轉(zhuǎn)列
創(chuàng)建語(yǔ)句:
create table test1(
id int auto_increment primary key ,
name varchar(255),
course varchar(255),
score int
)
insert into test1(name,course,score) values ('張三','語(yǔ)文',120);
insert into test1(name,course,score) values ('張三','數(shù)學(xué)',100);
insert into test1(name,course,score) values ('張三','英語(yǔ)',82);
insert into test1(name,course,score) values ('李四','語(yǔ)文',89);
insert into test1(name,course,score) values ('李四','數(shù)學(xué)',99);
insert into test1(name,course,score) values ('李四','英語(yǔ)',87);
insert into test1(name,course,score) values ('王五','語(yǔ)文',78);
insert into test1(name,course,score) values ('王五','數(shù)學(xué)',85);
insert into test1(name,course,score) values ('王五','英語(yǔ)',145);
insert into test1(name,course,score) values ('王五','物理',40);
insert into test1(name,course,score) values ('王五','化學(xué)',62);原始數(shù)據(jù):

1、第一種方法:
-- 使用case when then else,這里使用sum函數(shù)也可以 select name, max(case course when '語(yǔ)文' then score else 0 end)as 'chinese', max(case course when '數(shù)學(xué)' then score else 0 end)as 'math', max(case course when '英語(yǔ)' then score else 0 end)as 'english', max(case course when '物理' then score else 0 end)as 'wuli', max(case course when '化學(xué)' then score else 0 end)as 'huaxue' from test1 group by name
第一種結(jié)果:

2、第二種方法:
-- 使用if語(yǔ)句,這里使用sum函數(shù)也可以 select name, max(if(course = '語(yǔ)文',score,0))as 'chinese', max(if(course = '數(shù)學(xué)',score,0))as 'math', max(if(course = '英語(yǔ)',score,0))as 'english', max(if(course = '物理',score,0))as 'wuli', max(if(course = '化學(xué)',score,0))as 'huaxue' from test1 group by name
第二種結(jié)果:

3、第三種方法:
-- 動(dòng)態(tài)拼接sql語(yǔ)句,不管多少行都會(huì)轉(zhuǎn)列
set @sql = null;
select group_concat(distinct concat('max(if(a.course = ''',a.course,''', a.score, 0)) as ''',a.course, '''')) into @sql from test1 a;
set @sql = concat('select name,', @sql, 'from test1 a group by a.name' );
prepare stmt from @sql; -- 動(dòng)態(tài)生成腳本,預(yù)備一個(gè)語(yǔ)句
execute stmt; -- 動(dòng)態(tài)執(zhí)行腳本,執(zhí)行預(yù)備的語(yǔ)句
deallocate prepare stmt; -- 釋放預(yù)備的語(yǔ)句
-- 通過(guò)這個(gè)查詢拼接的sql
select @sql第三種結(jié)果:

查詢出來(lái)的sql結(jié)果:
-- 查詢出來(lái)的結(jié)果 select name,max(if(a.course = '語(yǔ)文', a.score, 0)) as '語(yǔ)文',max(if(a.course = '數(shù)學(xué)', a.score, 0)) as '數(shù)學(xué)',max(if(a.course = '英語(yǔ)', a.score, 0)) as '英語(yǔ)',max(if(a.course = '物理', a.score, 0)) as '物理',max(if(a.course = '化學(xué)', a.score, 0)) as '化學(xué)',max(if(a.course = '政治', a.score, 0)) as '政治'from test1 a group by a.name

4、第四種方法:
-- 使用distinct select distinct a.name, (select score from test1 b where a.name=b.name and b.course='語(yǔ)文' ) as 'chinese', (select score from test1 b where a.name=b.name and b.course='數(shù)學(xué)' ) as 'math', (select score from test1 b where a.name=b.name and b.course='英語(yǔ)' ) as 'english', (select score from test1 b where a.name=b.name and b.course='物理' ) as 'wuli', (select score from test1 b where a.name=b.name and b.course='化學(xué)' ) as 'huaxue' from test1 a
第四種結(jié)果:

5、第五種方法:
以下三種方法是可以做統(tǒng)計(jì)的用的,有三種統(tǒng)計(jì)寫法,有需求的話可以使用
-- 使用with rollup統(tǒng)計(jì)第一種 select ifnull(name,'總計(jì)') as name, max(if(course = '語(yǔ)文',score,0))as 'chinese', max(if(course = '數(shù)學(xué)',score,0))as 'math', max(if(course = '英語(yǔ)',score,0))as 'english', max(if(course = '物理',score,0))as 'wuli', max(if(course = '化學(xué)',score,0))as 'huaxue', sum(IF(course='total',score,0)) as 'total' from (select name,ifnull(course,'total') as course,sum(score) as score from test1 group by name, course with rollup having name is not null )as a group by name with rollup; -- 使用with rollup與union all統(tǒng)計(jì)第二種 select name, max(if(course = '語(yǔ)文',score,0))as 'chinese', max(if(course = '數(shù)學(xué)',score,0))as 'math', max(if(course = '英語(yǔ)',score,0))as 'english', max(if(course = '物理',score,0))as 'wuli', max(if(course = '化學(xué)',score,0))as 'huaxue', sum(score) as total from test1 group by name union all select 'total', max(if(course = '語(yǔ)文',score,0))as 'chinese', max(if(course = '數(shù)學(xué)',score,0))as 'math', max(if(course = '英語(yǔ)',score,0))as 'english', max(if(course = '物理',score,0))as 'wuli', max(if(course = '化學(xué)',score,0))as 'huaxue', sum(score) from test1 -- 使用if與with rollup統(tǒng)計(jì) select ifnull(name,'total') as name, max(if(course = '語(yǔ)文',score,0))as 'chinese', max(if(course = '數(shù)學(xué)',score,0))as 'math', max(if(course = '英語(yǔ)',score,0))as 'english', max(if(course = '物理',score,0))as 'wuli', max(if(course = '化學(xué)',score,0))as 'huaxue', sum(score) AS total from test1 group by name with rollup
第五種結(jié)果:
以上三種語(yǔ)句結(jié)果都是一樣的

6、第六種方法:
-- 使用group_concat,這個(gè)一般不推薦 select name, group_concat(course,':',score separator '@')as course from test1 group by name
第六種結(jié)果:

7、第七中方法:
-- 這個(gè)也不推薦使用
set @EE='';
select @EE :=concat(@EE,'sum(if(course= \'',course,'\',score,0)) as ',course, ',') as aa from (select distinct course from test1) a ;
set @QQ = concat('select ifnull(name,\'total\')as name,',@EE,' sum(score) as total from test1 group by name with rollup');
-- SELECT @QQ;
prepare stmt from @QQ;
execute stmt;
deallocate prepare stmt;第七種結(jié)果:

列轉(zhuǎn)行
創(chuàng)建語(yǔ)句:
create table test2(
id int auto_increment primary key ,
name varchar(255) ,
chinese int,
math int,
english int,
wuli int,
huaxue int
)
insert into test2(name,chinese,math,english,wuli,huaxue) values ('張三',110,120,85,null,null);
insert into test2(name,chinese,math,english,wuli,huaxue) values ('李四',130,88,89,null,null);
insert into test2(name,chinese,math,english,wuli,huaxue) values ('王五',93,124,87,98,67);原始數(shù)據(jù):

1、第一種方法:
有兩種寫法:
union與union all的區(qū)別就是: union可以去除重復(fù)結(jié)果集,union all不會(huì)去除重復(fù)的結(jié)果集
-- 第一種使用union實(shí)現(xiàn)列傳行 select name,'語(yǔ)文' as course, chinese as 'score' from test2 union select name,'數(shù)學(xué)' as course, math as 'score' from test2 union select name,'英語(yǔ)' as course, english as 'score' from test2 union select name,'物理' as course, wuli as 'score' from test2 union select name,'化學(xué)' as course, huaxue as 'score' from test2 order by name asc -- 第二種寫法可以對(duì)null值結(jié)果集處理 select * from (select name,'語(yǔ)文' as course, chinese as 'score' from test2 union select name,'數(shù)學(xué)' as course, math as 'score' from test2 union select name,'英語(yǔ)' as course, english as 'score' from test2 union select name,'物理' as course, wuli as 'score' from test2 union select name,'化學(xué)' as course, huaxue as 'score' from test2)a where a.score is not null order by name asc
第一種結(jié)果:
有null結(jié)果:

沒有null結(jié)果:

總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- mysql實(shí)現(xiàn)列轉(zhuǎn)行和行轉(zhuǎn)列方式
- MySQL實(shí)現(xiàn)列轉(zhuǎn)行與行轉(zhuǎn)列的操作代碼
- 搞定mysql行轉(zhuǎn)列的7種方法以及列轉(zhuǎn)行
- Mysql行與列的多種轉(zhuǎn)換(行轉(zhuǎn)列,列轉(zhuǎn)行,多列轉(zhuǎn)一行,一行轉(zhuǎn)多列)
- MySQL中列轉(zhuǎn)行和行轉(zhuǎn)列總結(jié)解決思路
- mysql 行轉(zhuǎn)列和列轉(zhuǎn)行實(shí)例詳解
- mysql行轉(zhuǎn)列(7種方法)和列轉(zhuǎn)行的實(shí)現(xiàn)
相關(guān)文章
Mysql命令行導(dǎo)入sql數(shù)據(jù)的代碼
Mysql命令行導(dǎo)入sql數(shù)據(jù)的實(shí)現(xiàn)方法是我們經(jīng)常會(huì)用到的,下面就為你詳細(xì)介紹Mysql命令行導(dǎo)入sql數(shù)據(jù)的方法步驟,希望對(duì)您學(xué)習(xí)Mysql命令行方面能有所幫助。2010-12-12
MySQL內(nèi)存及虛擬內(nèi)存優(yōu)化設(shè)置參數(shù)
這篇文章主要介紹了MySQL內(nèi)存及虛擬內(nèi)存優(yōu)化設(shè)置參數(shù),需要的朋友可以參考下2016-05-05
MySQL MyISAM 優(yōu)化設(shè)置點(diǎn)滴
MyISAM類型的表強(qiáng)調(diào)的是性能,其執(zhí)行數(shù)度比InnoDB類型更快, 只是不提供事務(wù)支持.大部分項(xiàng)目是讀多寫少的項(xiàng)目,而Myisam的讀性能是比innodb強(qiáng)不少的2016-05-05
解決MySQL批量新增或修改時(shí)出現(xiàn)異常:Lock?wait?timeout?exceeded
這篇文章主要給大家介紹了關(guān)于如何解決MySQL批量新增或修改時(shí)出現(xiàn)異常:Lock?wait?timeout?exceeded;try?restarting?transaction的相關(guān)資料,需要的朋友可以參考下2024-01-01
mysql中update和select結(jié)合使用方式
這篇文章主要介紹了mysql中update和select結(jié)合使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-08-08

