首页 > 解决方案 > 如何将具有空值的两行合并为一行替换空值?

问题描述

我的 sql 查询得到以下结果:

ID sp_firstname sp_lastname member_firstname 成员姓氏
1 无效的 无效的 约翰 史密斯
2 德娟 麦克劳克林 无效的 无效的
2 无效的 无效的 杰克 麻雀
3 约翰 沃克 无效的 无效的
3 无效的 无效的 夏洛克 福尔摩斯
4 梅莉 杜尔甘 无效的 无效的
4 无效的 无效的 约翰 华斯顿
5 露西 斯奈德 无效的 无效的

而我需要实现的是:

ID sp_firstname sp_lastname member_firstname 成员姓氏
1 无效的 无效的 约翰 史密斯
2 德娟 麦克劳克林 杰克 麻雀
3 约翰 沃克 夏洛克 福尔摩斯
4 梅莉 杜尔甘 约翰 华斯顿
5 露西 斯奈德 无效的 无效的

基本上,我需要以某种方式合并具有null交叉的行对。

在查看了 SO 答案后,我只能在NULL需要用数字替换值时找到这个问题的变体,在这种情况下,人们使用max了与group by.

但是,我的表中有几个连接,我的NULL值需要用字符串而不是数字替换,所以max在这里不会真正起作用(正如我所想的那样)。

这是我的sql代码:

select
    meeting.id,
    (case when salesprofile.userid = "user".id then "user".firstname end) as sp_firstname,
    (case when salesprofile.userid = "user".id then "user".lastname end) as sp_lastname,
    (case when business.userid = "user".id then "user".firstname end) as member_firstname,
    (case when business.userid = "user".id then "user".lastname end) as member_lastname
from
    meeting
    join project on project.id = meeting.projectid
    left join business on business.id = project.businessid
    left join salesprofile on salesprofile.id = meeting.salesprofileid
    join "user" on "user".id = business.userid or "user".id = salesprofile.userid
group by
    "user".id,
    business.userid,
    meeting.id,
    salesprofile.userid;

这些名字和姓氏来自完全相同的user表,但它们是基于在同一个meeting表中发现的不同关系而获取的。

基本上,一个meeting有两个users:membersp. 我需要一种方法来与它membersp用户一起开会。


如何修改我的 sql 查询,以便它将这些带有横向nulls 的行对合并到一个有数据但没有nulls 的行中?

标签: sqlpostgresqljoin

解决方案


您可以使用外部查询包装您的结果,以使用max和分组来聚合列id

 select id, Max(sp_firstname) as sp_firstname, Max(sp_lastname) as sp_lastname...
 from (
  <inner query>
 )x
 group by id

推荐阅读