使用PostgreSQL怎么合并多行并转为列

  介绍

这期内容当中小编将会给大家带来有关使用PostgreSQL怎么合并多行并转为列,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

需求将下列表格相同id的名称拼接起来输出成一列idName1peter1lily2john

转化后效果:

idName1peter; lily2john;

实现方式使用array_to_string和array_agg函数,具体语句如下:

string_agg(表情,分隔符)把表达式变成一个数组

string_agg(表情,分隔符)直接把一个表达式变成字符串

选择id, array_to_string (array_agg(名字),& # 39;;& # 39;)从表组通过id

<强>补充:Postgresql实现动态的行转列

问题

在数据处理中,常遇到行转列的问题,比如有如下的问题:

有这样的一张表

“Student_score"表:

姓名课程分数张三数学83张三物理93张三语文80李四语文74李四数学84年李四物理94

我们想要得到像这样的一张表:

姓名数学物理语文李849474年四张三839380

当数据量比较少时,我们可以在Excel中使用数据透视表数据透视表的功能实现这个需求,但当数据量较大,或者我们还需要在数据库中进行后续的数据处理时,使用数据透视表就显得不那么高效。

下面,介绍如何在Postgresql中实现数据的行转列。

静态写法

当我们要转换的值字段是数值型时,我们可以用SUM()函数:

CREATE  TABLE  Student_score(姓名,varchar、,课程,varchar、,分数,int);   INSERT  INTO  Student_score 值(& # 39;张三& # 39;,& # 39;数学& # 39;,83);   INSERT  INTO  Student_score 值(& # 39;张三& # 39;,& # 39;物理& # 39;,93);   INSERT  INTO  Student_score 值(& # 39;张三& # 39;,& # 39;语文& # 39;,80);   INSERT  INTO  Student_score 值(& # 39;李四& # 39;,& # 39;语文& # 39;,74);   INSERT  INTO  Student_score 值(& # 39;李四& # 39;,& # 39;数学& # 39;,84);   INSERT  INTO  Student_score 值(& # 39;李四& # 39;,& # 39;物理& # 39;,94);   select 姓名   ,,,(case 课程,when  & # 39;数学& # 39;,then 分数,结束),as 数学   ,,,(case 课程,when  & # 39;物理& # 39;,then 分数,结束),as 物理   ,,,(case 课程,when  & # 39;语文& # 39;,then 分数,结束),as 语文   得到Student_score   GROUP  BY  1

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

“Student_grade"表:

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

我们可以用string_agg()函数:

CREATE  TABLE  Student_grade(姓名,varchar、,课程,varchar,,等级,varchar);   INSERT  INTO  Student_grade 值(& # 39;张三& # 39;,& # 39;数学& # 39;,& # 39;优& # 39;);   INSERT  INTO  Student_grade 值(& # 39;张三& # 39;,& # 39;物理& # 39;,& # 39;良& # 39;);   INSERT  INTO  Student_grade 值(& # 39;张三& # 39;,& # 39;语文& # 39;,& # 39;及格& # 39;);   INSERT  INTO  Student_grade 值(& # 39;李四& # 39;,& # 39;语文& # 39;,& # 39;及格& # 39;);   INSERT  INTO  Student_grade 值(& # 39;李四& # 39;,& # 39;数学& # 39;,& # 39;良& # 39;);   INSERT  INTO  Student_grade 值(& # 39;李四& # 39;,& # 39;物理& # 39;,& # 39;优& # 39;);

选择姓名

,,, string_agg ((case 课程,when  & # 39;数学& # 39;,then 等级,结束),& # 39;& # 39;),as 数学   ,,,string_agg ((case 课程,when  & # 39;物理& # 39;,then 等级,结束),& # 39;& # 39;),as 物理   ,,,string_agg ((case 课程,when  & # 39;语文& # 39;,then 等级,结束),& # 39;& # 39;),as 语文   得到Student_grade   GROUP  BY  1

内置函数(半动态)

Postgresql内置了tablefunc可实现数据透视表的功能。

语法:

SELECT  *   得到交叉表(   ,& # 39;select  row_name,猫,价值   ,得到表   order 才能;by  1, 2 & # 39;   AS  (row_name 类型,category_1 类型,category_2 类型,category_3 类型,…),

例如:

SELECT  *   得到交叉表(   ,& # 39;select 姓名,课程,分数   ,得到Student_score   order 才能;by  1, 2 & # 39;   AS (姓名,varchar,,数学,int,,物理,int,,语文,int);

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

使用PostgreSQL怎么合并多行并转为列