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 scoresPIVOT (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函数还支持聚合操作,可以对转换之后的数据进行统计计算。