mysql的行列互转

多行转多列

多行转多列,就是数据库中存在的多条具有一定相同值的行数据,通过提取相同值在列头展示来实现行数据转为列数据,一般提取的值为枚举值。

思路

转换前表样式 ->
转换前
转换后表样式 ->
转换后
首先,我们知道month是枚举类型,值是固定的,将行数据转换成列数据的时候,我们可以通过对每行数据进行判断,使用case语句对month值进行选择性执行,并将执行结果作为一个列。这样,只要我们把month的所有值均判断执行,就可以实现行项数据转为列项数据。

实现代码

select id,
sum(case when month='Jan' then revenue end) as Jan_Revenue,
sum(case when month='Feb' then revenue end) as Feb_Revenue,
sum(case when month='Mar' then revenue end) as Mar_Revenue,
sum(case when month='Apr' then revenue end) as Apr_Revenue,
sum(case when month='May' then revenue end) as May_Revenue,
sum(case when month='Jun' then revenue end) as Jun_Revenue,
sum(case when month='Jul' then revenue end) as Jul_Revenue,
sum(case when month='Aug' then revenue end) as Aug_Revenue,
sum(case when month='Sep' then revenue end) as Sep_Revenue,
sum(case when month='Oct' then revenue end) as Oct_Revenue,
sum(case when month='Nov' then revenue end) as Nov_Revenue,
sum(case when month='Dec' then revenue end) as Dec_Revenue
from department
group by id

多列转多行

思路

转换前的样式->
转换前
转换后表样式 ->
转换后

可以看出,表中存在多个列项值。如果要把列项值转为行项值,首先我们可以考虑的方式就是把每个列转为一行数据,这样可以把所有列均转为独立的行项数据,但此时的行项数据是每个数据一条单独行项记录,并不符合我们所需要的要求,所以最后我们还需要把所有的独立行项数据进行连接。

代码

SELECT id,Jan_Revenue,'Jan_Revenue' as month
from department_row
UNION
SELECT id,Feb_Revenue,'Feb_Revenue' as month
from department_row
UNION
SELECT id,Mar_Revenue,'Mar_Revenue' as month
from department_row
UNION
SELECT id,Apr_Revenue,'Apr_Revenue' as month
from department_row
UNION
SELECT id,May_Revenue,'May_Revenue' as month
from department_row
UNION
SELECT id,Jun_Revenue,'Jun_Revenue' as month
from department_row
UNION
SELECT id,Jul_Revenue,'Jul_Revenue' as month
from department_row
UNION
SELECT id,Aug_Revenue,'Aug_Revenue' as month
from department_row
UNION
SELECT id,Sep_Revenue,'Sep_Revenue' as month
from department_row
UNION
SELECT id,Oct_Revenue,'Oct_Revenue' as month
from department_row
UNION
SELECT id,Nov_Revenue,'Nov_Revenue' as month
from department_row
UNION
SELECT id,Dec_Revenue,'Dec_Revenue' as month
from department_row
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值