最近工作用到了好幾次列轉行,做個小總結。順道也總結一下行轉列
轉換之前的**,第
三、四列分別為特徵和數值
圖1首先看第一次的執行sql:
select
id , name ,
(case 特徵 when
'年齡'
then 數值 else
0end
)as age,
(case 特徵 when
'身高'
then 數值 else
0end
)as height,
(case 特徵 when
'體重'
then 數值 else
0end
)as weight
from user2
第一次的執行sql效果:
圖2行轉列關鍵點一
1、首先行轉列的第乙個關鍵點是用到了case when then else end
, 查詢出的圖2新的**3、4、5列(age、height、weight
)是根據圖1的**第3列特徵
那列的三種情況(身高、體重、年齡)來當作列名的,然後再取別名as age
、as height
、as weight
。此時新**的列已定好,行數還未發生改變,呈現圖二這種情況
再來看一下第二次的執行sql:
select
id , name ,
max(
case 特徵 when
'年齡'
then 數值 else
0end
)as age,
max(
case 特徵 when
'身高'
then 數值 else
0end
)as height,
max(
case 特徵 when
'體重'
then 數值 else
0end
)as weight
from user2
group
by name
第二次的執行sql效果:
圖3行轉列關鍵點二
2、相比於第一次sql,第二次sql多了group by
與max
,這也是行轉列的第二個關鍵點,將資料進行分組,再取每列的最大值。小明在圖2中是三條資料,通過max取每列的最大使得三條資料合併為一條資料,至此出現圖3這種我們需要的效果
注意:
1、行轉列時需要轉換的行中的值不可為非數字,否則影響max()的使用
轉換之前的**,第
三、四、五列分別為age、height、weight
圖4執行sql:
select id , name ,
'年齡'
as 特徵 , age as 數值 from
user
union
select id , name ,
'身高'
as 特徵 , height as 數值 from
user
union
select id , name ,
'體重'
as 特徵 , weight as 數值 from
user
order
by id
執行sql之後的效果
圖5相對於行轉列,列轉行就顯得更簡單一些,只用到了乙個union
列轉行關鍵點:
union
,使用'年齡' as 特徵、'身高' as 特徵、'體重' as 特徵
來確定圖5第3列的列名與每行資料該列的值,使用age as 數值、height as 數值、weight as 數值
來確定圖5第4列的列名與每行資料該列的值,3個select 查詢出3張**,再通過union連線成一張**
union注意點
使用union連線表時需要注意表的字段一致,此處我們3個select 查詢出3張**欄位是一致的。
MySQL行轉列與列轉行
建表 新增資料 create table test tb grade id int 10 not null auto increment,user name varchar 20 default null,course varchar 20 default null,score float defa...
Mysql 行轉列 列轉行
create table test tb grade id int 10 not null auto increment,user name varchar 20 default null,course varchar 20 default null,score float default 0 pr...
MySQL行轉列 列轉行
max case course when 數學 then score else 0 end 數學,max case course when 語文 then score else 0 end 語文,max case course when 英語 then score else 0 end 英語 fro...