sql怎么进行行转列

首先我们来看Oracle一个函数decode(条件,值1,翻译值1,值2,翻译值2…)
和case 条件 when 值1 then 返回值1 when 值2 then 返回值2…语句
Mysql的操作大同小异

例子如下:

--sal*1.1和sal*1.2可以替换为
--一个具体的数字或是其他字段的字段名
--也可以是其他字段名的计算表达式
select ename,sal,deptno,decode(deptno,10,sal*1.1,20,sal*1.2) from emp;

上面decode相当于

if(deptno == 10)
	sal *= 1.1;
else if(deptno == 20)
	sal *= 1.2;

对每个符合条件的sal进行对应修改并作为结果显示出来
上面查询会显示4列结果分别是ename,sal,deptno,decode(sal)

而如果用case when语句则写法如下

select ename,
		sal,
		deptno,
		case deptno
			when 10 then
				sal * 1.1
			when 20 then
				sal * 1.2
		end
	from emp;

知道有上面的操作后假设有个这样的test表:
在这里插入图片描述
我们要把它转换成:

姓名性别年龄
张三50
刘二30
刘三10

用decode处理表格后结果如下:

--value表示值本身,可以对value进行操作,也可什么都不做
--type是字段名
select decode(type,1,value) as 姓名,
		decode(type,2,value) as 性别,
		decode(type,3,value) as 年龄,
		from test;

在这里插入图片描述
用decode配合组函数(如:max())后多行汇聚成了一行:

select max(decode(type,1,value)) as 姓名,
		max(decode(type,2,value)) as 性别,
		max(decode(type,3,value)) as 年龄,
		from test;

在这里插入图片描述
最后我们利用test表的t_id对结果进行分组:

select max(decode(type,1,value)) as 姓名,
		max(decode(type,2,value)) as 性别,
		max(decode(type,3,value)) as 年龄,
		from test group by t_id;

我们得到想要的结果了!!!
在这里插入图片描述

除了上面的decode和case when方法还可以用 子查询+表连接 以及 union all+字段占位的方法进行 行转列,但是就效率上来说decode和case when的方法效率最高

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值