简单的理解( 横表 竖表 转换)SQL操作(以oracle为例)

10 篇文章 0 订阅
9 篇文章 0 订阅

简单的行转列  :单个表头名称列,单个数据值列,单个聚合条件列

某列属性聚合多个值,现在展开显示,与其对应的数据横向展示(这里至少涉及到  表头名称列,数据值列),另外多个数据还需要依据某个数据列作为聚合的条件,比如code,rec_id,name,time之类的。因此,简单的行转列仅仅涉及三个数据列。例如常见的例子,学生的学科成绩展示。

namesubjectsocre
小米语文90
小米数学100

 

需要转换成:

name语文数学
小米90100

这里subject是属于表头名称列,转换出来后,是作为对应的表头名称,score是对应的数据值列,与subjce对应。而name属于聚合条件列。根据name聚合,subject展开来展示数据score。这就是竖表转横表(指score数据值的变化)。

实现竖表转横表的几种常用方法(行转列)decode\case when\pivot

SELECT
	NAME,
	SUM( DECODE(SUBJCT, "语文", SCORE) ) AS “语文”,
	SUM( DECODE(SUBJCT, "数学", SCORE) ) AS “数学”
FROM
	T_STUDENT_SOCRE
GROUP BY 
NAME

SELECT
	NAME,
	SUM( CASE SUBJECT WHEN "语文" THEN E_VALUE ELSE 0 END ) AS “语文”,
	SUM( CASE SUBJECT WHEN "数学" THEN E_VALUE ELSE 0 END ) AS “数学”
FROM
	T_STUDENT_SOCRE
GROUP BY 
NAME
SELECT
 NAME
"语文",
“数学”
FROM
T_STUDENT_SOCRE
PRVOT(MAX(SOCRE) for SUBJECT in ("语文" as “语文“,”数学“ as "数学") )

通过简单的简单的行转列例子,我们可以把复杂的行转列的案例/业务场景抽象成如下的描述。

复杂的行转列  :单个表头名称列,多个数据值列,多个聚合条件列。

这里表头名一定是单个的,且要被单独特殊处理成表格的表头列名称。

其次表头列对应的数据可能是不只一个数据列,比如描述复杂的业务结果——某月最高日销量,对应数据包括销量,日期。这里通常的处理是做子查询,通过条件筛选完数据后,使用拼接把多个数据列,聚合为单个数据列。

多个聚合条件列非常方便的处理便是使用group by,后续接多个条件列即可。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值