Oracle中用于行转列的函数pivot与unpivot(oracle中行转列函数)

Oracle中用于行转列的函数:pivot与unpivot

在实际数据库开发中,经常会遇到需要将某列数据在行与列之间进行转换的情况,这个转换过程被称为“行转列”。Oracle提供了两个函数:pivot与unpivot,用于实现这种转换操作。

pivot函数

pivot函数用于将表格中的行数据在列之间进行转换。具体来说,pivot函数将一列数据转换为多列数据。同时,pivot函数也支持聚合操作,可以在转换之后对数据进行统计求和、平均、计数等操作。

pivot函数语法如下:

SELECT , [], [], … []
FROM
PIVOT (() FOR IN (, , … ));

其中,非聚合列表示不参与聚合计算的列,而聚合列则需要通过聚合函数进行统计。转换列则是pivot函数将其转换为列的列名,而列1至列n则是需要进行转换的具体列名。

下面以一个例子来说明pivot函数的使用方法。假设我们有一个学生成绩表(表名为scores),包含三个字段:学生ID(student_id)、科目(subject)和分数(score)。现在我们希望将科目转换为列,同时对每个学生在每个科目下的分数求和。可以使用如下SQL语句实现:

SELECT *
FROM scores
PIVOT (SUM(score) FOR subject IN ('math' AS math_score, 'english' AS english_score, 'chinese' AS chinese_score));

unpivot函数

unpivot函数则是pivot函数的反向操作,用于将表格中的列数据在行之间进行转换。具体来说,unpivot函数将多列数据转换为一列数据。

unpivot函数语法如下:

SELECT , , 
FROM ()
UNPIVOT ( FOR IN (, , … ));

其中,非转换列和聚合列与pivot函数中的意义相同。转换列则是unpivot函数将其转换为列的列名,而列1至列n则是需要进行转换的具体列名。

下面还以上面的学生成绩表为例,假设我们希望将学生ID与科目进行拆分,同时将每个学生在不同科目下的分数转换为一列。可以使用如下SQL语句实现:

SELECT student_id, subject, score
FROM (
SELECT *
FROM scores
)
UNPIVOT (
score FOR subject IN (math_score, english_score, chinese_score)
);

总结

通过pivot与unpivot函数,我们可以轻松实现行列之间的转换操作。无论是将一列数据转换为多列数据,还是将多列数据转换为一列数据,都可以通过这两个函数实现。此外,pivot与unpivot函数还支持聚合操作,可以对转换之后的数据进行统计计算。


数据运维技术 » Oracle中用于行转列的函数pivot与unpivot(oracle中行转列函数)