这期内容当中小编将会给大家带来有关使用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怎么合并多行并转为列