mysql实现行转列,列转行

本文介绍如何使用SQL实现数据的行转列和列转行操作,包括具体的SQL语句示例,帮助读者掌握数据透视技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一: 行转列

部门金额类型
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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

他山之石女士

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

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

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

打赏作者

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

抵扣说明:

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

余额充值