Oracle中使用decode优雅的行转列

最近笔者在工作中终于还是碰到了行转列的应用场景,做一下笔记供自己查看和帮助有需求的人。

在其他关系数据库中,大多推荐用case when then end这种臃肿复杂的写法,最近看到oracle数据库中独有的函数decode十分优雅,下面简单介绍一下。

decode函数

定义:

decode(条件,值1,返回值1,值2,返回值2,...值n,返回值n,缺省值)

在代码中可以理解为:

if 条件==值1:    返回值1elif 条件==值2:    返回值2elif 条件==值n:    返回值nelse:    缺省值

在关系数据库中可以理解为:

case 条件    when 值1 then 返回值1    when 值2 then 返回值2    when 值n then 返回值n    else 缺省值 end as 列

示例:

TYPENAMECLASSNUM_FLAG
水果香蕉出售50
水果香蕉剩余23
水果香蕉单价7
宠物小猫出售3
宠物小猫剩余5

SQL语句:

SELECT TYPE,NAME, SUM(DECODE(CLASS,'出售',NUM_FLAG,0)) AS 出售, SUM(DECODE(CLASS,'剩余',NUM_FLAG,0)) AS 剩余, SUM(DECODE(CLASS,'单价',NUM_FLAG,0)) AS 单价FROM TEMP_TABLE GROUP BY TYPE,NAME

执行后效果

TYPENAME出售剩余单价
水果香蕉50237
宠物小猫350