当我们要转换的值字段是字符型时,比如我们的表是这样的:
"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
以上为个人经验,希望能给大家一个参考,也希望大家多多支持七叶笔记。如有错误或未考虑完全的地方,望不吝赐教。