七叶笔记 » 数据库 » PostgreSQL 实现将多行合并转为列

PostgreSQL 实现将多行合并转为列

当我们要转换的值字段是字符型时,比如我们的表是这样的:

"Student_grade"表:

姓名 数学 物理 语文 张三 优 良 及格 李四 良 优 及格

我们可以用string_agg()函数:

select 姓名

内置函数(半动态)

Postgresql内置了tablefunc可实现pivot table的功能。

语法:

例如:

需要注意的是crosstab( text sql) 中的sql语句必须按顺序返回row_name, category , value,并且必须声明输出的各列的列名和数据类型。当原表中的cat列有很多不同的值,那我们将会得到一个有很多列的表,并且我们需要手动声明每个列的列名及数据类型,显然这种体验非常不友好。那有没有更好的方式呢,我们可以通过手动建立存储过程(函数)实现。

自建函数(动态)

动态的行转列我们通过plpgsql实现,大致的思路如下:

判断value字段的数据类型,如果是数值型,则转入2.,否则转入3.

对cat列中的每个distinct值使用sum(case when),转成列

对cat列中的每个distinct值使用string_agg(case when),转成列

实现代码示例:

调用示例:

SELECT long_to_wide('Student_grade', '姓名','课程', '等级')

生成的表名为Student_grade_wide

以上为个人经验,希望能给大家一个参考,也希望大家多多支持七叶笔记。如有错误或未考虑完全的地方,望不吝赐教。

相关文章