mysql实现行转列,列转行

一: 行转列

部门金额类型
001100aaa
00150aaa
002100eee
00340bbb
004300ccc
部门aaabbbccceee
001150
002100
00340
004300

可以看出,这里行转列是将原来的类型字段的多行内容选出来,作为结果集中的不同列,并根据部门进行分组显示对应的金额

select 部门,

sum(case when 类型 = 'aaa' then 金额 end) as aaa,

sum(case when 类型 = 'bbb' then 金额 end) as bbb,

sum(case when 类型 = 'ccc' then 金额 end) as ccc,

sum(case when 类型 = 'eee' then 金额 end) as eee

from (

select '001' as 部门,100 as 金额,'aaa' as 类型 from dual

union all

select '001' as 部门,50 as 金额,'aaa' as 类型 from dual

union all

select '002' as 部门,100 as 金额,'eee' as 类型 from dual

union all

select '003' as 部门,40 as 金额,'bbb' as 类型 from dual

union all

select '004' as 部门,300 as 金额,'ccc' as 类型 from dual

)  tempTb group by 部门

说明:粉色部分是模拟一张表 tempTb

二:列转行

部门aaabbbccceee
001100
00150
002100
00340
004300
部门金额类型
001100aaa
00150aaa
002100eee
00340bbb
004300ccc

可以看出,这里列转行是将原来的多个不同列名选出来,作为结果集中的同一列,并根据部门进行分组显示对应的金额

select 部门, aaa as '金额' ,'aaa' as '类型'
from (
 select '001' as 部门,'100' as aaa, '' as bbb, '' as ccc, '' as eee from dual
 union all 
 select '001' as 部门,'50' as aaa, '' as bbb, '' as ccc, '' as eee from dual
 union all
 select '002' as 部门,'' as aaa, '' as bbb, '' as ccc, '100' as eee from dual
 union all
 select '003' as 部门,'' as aaa, '40' as bbb, '' as ccc, '' as eee from dual
 union all
 select '004' as 部门,'' as aaa, '' as bbb, '300' as ccc, '' as eee from dual
)  tempTb where aaa <> ''
union all
select 部门, eee as '金额' ,'eee' as '类型'
from (
 select '001' as 部门,'100' as aaa, '' as bbb, '' as ccc, '' as eee from dual
 union all 
 select '001' as 部门,'50' as aaa, '' as bbb, '' as ccc, '' as eee from dual
 union all
 select '002' as 部门,'' as aaa, '' as bbb, '' as ccc, '100' as eee from dual
 union all
 select '003' as 部门,'' as aaa, '40' as bbb, '' as ccc, '' as eee from dual
 union all
 select '004' as 部门,'' as aaa, '' as bbb, '300' as ccc, '' as eee from dual
)  tempTb where eee <> ''
union all
select 部门, bbb as '金额' ,'bbb' as '类型'
from (
 select '001' as 部门,'100' as aaa, '' as bbb, '' as ccc, '' as eee from dual
 union all 
 select '001' as 部门,'50' as aaa, '' as bbb, '' as ccc, '' as eee from dual
 union all
 select '002' as 部门,'' as aaa, '' as bbb, '' as ccc, '100' as eee from dual
 union all
 select '003' as 部门,'' as aaa, '40' as bbb, '' as ccc, '' as eee from dual
 union all
 select '004' as 部门,'' as aaa, '' as bbb, '300' as ccc, '' as eee from dual
)  tempTb where bbb <> ''
union all
select 部门, ccc as '金额' ,'ccc' as '类型'
from (
 select '001' as 部门,'100' as aaa, '' as bbb, '' as ccc, '' as eee from dual
 union all 
 select '001' as 部门,'50' as aaa, '' as bbb, '' as ccc, '' as eee from dual
 union all
 select '002' as 部门,'' as aaa, '' as bbb, '' as ccc, '100' as eee from dual
 union all
 select '003' as 部门,'' as aaa, '40' as bbb, '' as ccc, '' as eee from dual
 union all
 select '004' as 部门,'' as aaa, '' as bbb, '300' as ccc, '' as eee from dual
) tempTb  where ccc <> ''

说明:粉色部分是模拟一张表 tempTb

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

他山之石女士

你一元我一元,是我创作的源泉

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值