pgsql列转行,多结果集合并(条件关联)

需求

数据库横向数据,页面纵向展示,多结果集合并

源数据结果集- -1

在这里插入图片描述

源数据结果集- -2

在这里插入图片描述

需要的效果

在这里插入图片描述

第一步,将每个结果集进行列转行
关键点(利用pgsql的unnest函数):

语法:unnest(anyarray)
返回值:setof anyelement(可以理解为一个(临时)表)
说明:unnest函数将输入的数组转换成一个表,这个表的每一列都代表相应的一个数组中的元素。
如果unnest与其他字段一起出现在select中,就相当于其他字段进行了一次join。

简单来说,unnest()可以将传入的数组输出为一个表(显示为每一行数据)
这样,我们就可以先将(结果集- -1)中的每一列数据拼接成一个带有特殊字符(如:逗号等)的一列数据,然后利用pgsql的string_to_array()函数将该列切割为一个数组,再传入到unnest()函数中,执行后就是我们想要的结果(列转行)
结果集- -1 处理第一步,合并每列数据为一列

这里我们需要拼接两个字段,因为后面我们要多个结果集合并,需要有一个条件列(如上面两个结果集中,列表头是一致的,当列转行后,我们当做其条件进行多结果集的合并【PS:实际上就是左连接的条件】)

拼接–分割思路:
数据与表头一组,用‘~’隔开【多结果集左连接的关联条件】;
每一列与相邻列,用‘,’合开【列转行的关键分隔】;
格式是:
条件(表头)+“~”+数据+“,”
条件(表头)+“~”+数据+“,”
条件(表头)+“~”+数据+“,”
条件(表头)+“~”+数据+“,”
在这里插入图片描述

结果集- -1 处理第二步,进行列转行

1)进行字符串的切割,将该列转换为数组【利用第一步中的(列转行关键分隔)】
在这里插入图片描述
2)利用unnest()函数进行列–行转换
得到每一行数据格式为:条件+“~”+数据
在这里插入图片描述
3)将数据与条件拆分为两列,利用split_part()函数

在这里插入图片描述

结果集- -2 进行上面一样的处理,最后得到:

在这里插入图片描述

两个结果集进行left join,就得到我们想要的啦,下面是整个sql的截图

在这里插入图片描述

应该还有其他的方案,如果大家有什么更好的处理方案,记得分享呀,( ̄▽ ̄)~*
  • 4
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
Pgsql列转行函数是通过使用子查询和字符串聚合函数来实现的。其中一个常用的方法是使用regexp_split_to_table函数将包含多个值的列拆分成多个行,并使用string_agg函数将这些行合并成一个字符串。以下是一个例子: ```sql SELECT string_agg(a.code,',') FROM ( SELECT regexp_split_to_table(permit_type,',') as code FROM food_perfect_factor WHERE permit_number = 'SC20152272518392' ) a ``` 在这个例子中,我们将`permit_type`列的值按逗号进行拆分,然后使用string_agg函数将拆分后的值重新组合成一个字符串。这个查询将返回一个包含拆分后值的逗号分隔的字符串。123 #### 引用[.reference_title] - *1* *2* [PostgreSQL 行转列、列转行字符串函数、字符串分割函数](https://blog.csdn.net/MyySophia/article/details/93190190)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}} ] [.reference_item] - *3* [PostgreSQL 行转列、列转行字符串函数](https://blog.csdn.net/weixin_41542329/article/details/127240392)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}} ] [.reference_item] [ .reference_list ]
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Rain-C

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值