简单的行转列 :单个表头名称列,单个数据值列,单个聚合条件列
某列属性聚合多个值,现在展开显示,与其对应的数据横向展示(这里至少涉及到 表头名称列,数据值列),另外多个数据还需要依据某个数据列作为聚合的条件,比如code,rec_id,name,time之类的。因此,简单的行转列仅仅涉及三个数据列。例如常见的例子,学生的学科成绩展示。
name | subject | socre |
小米 | 语文 | 90 |
小米 | 数学 | 100 |
需要转换成:
name | 语文 | 数学 |
小米 | 90 | 100 |
这里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,后续接多个条件列即可。