Oracle 实现不同行转列的技巧(oracle 不同行转列)

Oracle 实现不同行转列的技巧

在数据分析和报表制作过程中,有时需要将表格中不同行的数据转化为同一行输出,这就需要使用行转列技巧。Oracle 数据库作为一个强大的关系型数据库管理系统,提供了多种行转列的实现方式,下面我们以实际案例为例,介绍其中的一些技巧。

案例描述:

我们有一个考试成绩表,其中包含每个学生的名字、科目和成绩,如下所示:

姓名 | 科目 | 成绩

张三 | 语文 | 80

张三 | 数学 | 90

张三 | 英语 | 85

李四 | 语文 | 70

李四 | 数学 | 75

李四 | 英语 | 80

现在需要将该表转化为以姓名为唯一标识,各科目成绩为列的输出,如下所示:

姓名 | 语文 | 数学 | 英语

张三 | 80 | 90 | 85

李四 | 70 | 75 | 80

解决方案:

1. 使用 Oracle PIVOT 函数

Oracle PIVOT 函数是 Oracle 11g 及以上版本提供的一种行转列的函数,其语法如下:

SELECT *

FROM (

SELECT [行标识列], [列标识列], [需要转换的值] FROM [表名])

PIVOT (

[聚合函数] ([需要转换的值]) FOR [列标识列] IN ([列1], [列2], …, [列n]))

应用于我们的案例,具体语句如下:

SELECT *

FROM (

SELECT name, subject, score FROM score)

PIVOT (

MAX(score) FOR subject IN (‘语文’, ‘数学’, ‘英语’));

其中,MAX 函数指定了转换后每一行中的聚合方式,最后通过指定需要转换的列标识列和输出的列名称实现行转列。

2. 使用 Oracle DECODE 函数

Oracle DECODE 函数是一种常用的条件语句函数,可以用于实现行转列的需求。其语法如下:

DECODE([比较参数], [比较值1], [返回值1], [比较值2], [返回值2], …, [默认返回值])

应用于我们的案例,具体语句如下:

SELECT name,

MAX(DECODE(subject, ‘语文’, score, NULL)) AS “语文”,

MAX(DECODE(subject, ‘数学’, score, NULL)) AS “数学”,

MAX(DECODE(subject, ‘英语’, score, NULL)) AS “英语”

FROM score

GROUP BY name;

其中,通过 DECODE 函数和 GROUP BY 分组实现了行转列,MAX 函数用于实现聚合,NULL 用于表示无对应值。

总结:

以上两种方式都可以实现行转列的需求,只是适用于不同场景的不同需求。Oracle PIVOT 函数适用于需要进行复杂聚合操作的场景,而 Oracle DECODE 函数则适用于相对简单的场景,具体使用需要结合实际情况加以考虑。


数据运维技术 » Oracle 实现不同行转列的技巧(oracle 不同行转列)