行列互转之case when

本文介绍如何使用SQL进行数据转换,包括行转列和列转行的操作。通过CASE WHEN语句和MAX函数实现行转列,利用UNION ALL完成列转行。此外,还展示了如何创建临时表以提高数据处理效率。

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

--查看数据结构
select * from emp;
select ename,sal,deptno from emp;


--行转列,case when和max()函数
select ename,
max(case deptno when 10 then sal end) d10,
max(case deptno when 20 then sal end) d20,
max(case deptno when 30 then sal end) d30 from emp
group by ename;


--行转列,case when
select ename,
case when deptno=10 then sal end d10,
case when deptno=20 then sal end d20,
case when deptno=30 then sal end d30 from emp;


--行转列,case when的另一种形式
select ename,
case deptno when 10 then sal end d10,
case deptno when 20 then sal end d20,
case deptno when 30 then sal end d30 from emp;


--列转行,使用union,union all集合操作。
--为提高性能,建议使用临时表,少用SQL嵌套
select ename,10 deptno,d10 sal from
(select ename,
case deptno when 10 then sal end d10,
case deptno when 20 then sal end d20,
case deptno when 30 then sal end d30 from emp) where d10 is not null
union all
select ename,20 deptno,d20 sal from
(select ename,
case deptno when 10 then sal end d10,
case deptno when 20 then sal end d20,
case deptno when 30 then sal end d30 from emp) where d20 is not null
union all
select ename,30 deptno,d30 sal from
(select ename,
case deptno when 10 then sal end d10,
case deptno when 20 then sal end d20,
case deptno when 30 then sal end d30 from emp) where d30 is not null;


--把数据放入临时表
  create table temp_column as select ename,
    case deptno when 10 then sal end d10,
    case deptno when 20 then sal end d20,
    case deptno when 30 then sal end d30 from emp;
    
 create table temp_line as select * from
  (select ename,10 deptno,d10 sal from temp_column where d10 is not null
  union all
  select ename,20 deptno,d20 sal from temp_column where d20 is not null
  union all
  select ename,30 deptno,d30 sal from temp_column where d30 is not null);
  --drop table temp_column;
  --drop talbe temp_line;


--查询处理后的数据
select * from temp_column;
select * from temp_line;


create table fruit
(imonth varchar2(10),
ename varchar2(10),
sale number);
--drop table fruit;


insert into fruit values('1月','杨梅',11);
insert into fruit values('1月','蓝莓',22);
insert into fruit values('1月','樱桃',33);
insert into fruit values('2月','杨梅',111);
insert into fruit values('2月','蓝莓',222);
insert into fruit values('2月','樱桃',333);


select * from fruit;


select imonth,
 case ename when '杨梅' then sale end 杨梅,
 case ename when '蓝莓' then sale end 蓝莓,
 case ename when '樱桃' then sale end 樱桃 from fruit;


create table temp_friut_column as
select imonth,
 max(case ename when '杨梅' then sale end) 杨梅,
 max(case ename when '蓝莓' then sale end) 蓝莓,
 max(case ename when '樱桃' then sale end) 樱桃 from fruit
 group by imonth;
 
select imonth,'杨梅' ename,杨梅 sale from temp_friut_column
union all
select imonth,'蓝莓' ename,蓝莓 sale from temp_friut_column
union all
select imonth,'樱桃' ename,樱桃 sale from temp_friut_column;
 















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值