行转列:源表:
![oracle中的行转列,列转行](http://img.zhejianglong.com/231018/02455V015-0.png)
文章插图
方法1:case when
select y,sum(case when q=1 then amt end) q1,sum(case when q=2 then amt end) q2,sum(case when q=3 then amt end) q3,sum(case when q=4 then amt end) q4from test04 group by y;
效果:
![oracle中的行转列,列转行](http://img.zhejianglong.com/231018/02455T592-1.png)
文章插图
方法2:decade(decode(字段,v1(字段值或运算后的值),retu1(字段值或运算后的值与v1一直的返回值),retu(不一致的返回值)))
select y,sum(decode(q,1,amt)) as q1,sum(decode(q,2,amt)) as q2,sum(decode(q,3,amt)) as q3,sum(decode(q,4,amt)) as q4from test04group by y;
效果:
![oracle中的行转列,列转行](http://img.zhejianglong.com/231018/02455U641-2.png)
文章插图
方法3:pivot
select * from test04pivot(sum(amt) for q in(1 as q1,2 as q2,3 as q3,4 as q4))
效果:
![oracle中的行转列,列转行](http://img.zhejianglong.com/231018/02455T334-3.png)
文章插图
总结:case when 和decode 都是逐行判断,然后聚合取值,不同的是decode属于oracle内置函数,所以从运行效率上来说:pivot>decode>case when
列转行:
unpivot:unpivot(新列名 for 聚合列名 in (对应的列名1…列名n ))
select * from (select * from test04pivot(sum(amt) for q in(1 as q1,2 as q2,3 as q3,4 as q4))) --沿用上面行转列的基础上,进行列转行回来unpivot(amt for q in(q1,q2,q3,q4))
效果:
![oracle中的行转列,列转行](http://img.zhejianglong.com/231018/02455S5Q-4.png)
文章插图
【oracle中的行转列,列转行】
推荐阅读
- 工作7年收集到的git命令
- C#/VB.NET 读取条码类型及条码在图片中的坐标位置
- 编码中的Adapter,不仅是一种设计模式,更是一种架构理念与解决方案
- JuiceFS 在 Elasticsearch/ClickHouse 温冷数据存储中的实践
- 迷你世界中的车要如何制作(迷你世界里的车如何制作)
- 抖音中怎么和短视频中的人进行合拍(抖音无缝合拍突然没有是什么原因)
- 如何通过 Java 代码隐藏 Word 文档中的指定段落
- Monaco Editor 中的 Keybinding 机制
- 堪称植物界中的吸甲醛之王,吊兰是否真的能吸收甲醛?
- 历史中的海兰珠究竟有多受宠 海兰珠生平简介