如何编写SQL查询合并同表不同行非NULL字段补全完整记录
SQL 同表合并多行列缺失字段方案
核心原理
SQL的聚合函数(如MAX()/MIN())在计算时会自动忽略NULL值,我们可以利用这个特性,将属于同一分组的多条记录的非空值聚合到同一行。
注:你给出的示例数据中两条记录的Client Id不一致属于笔误,我们按两种常见场景给出方案:
场景1:多条记录属于同一客户(有共同分组维度,比如Client Id相同)
假设表名为client_info,查询语句如下:
SELECT `Client Id`, MAX(Name) AS Name, MAX(Email) AS Email FROM client_info GROUP BY `Client Id`;
MAX()和MIN()效果完全一致,因为同一分组下对应字段仅存在一个非空值,取最大/最小结果相同。
场景2:无共同分组维度,仅需合并所有行的非空值为单行
对应你给出的示例需求,可直接全表聚合得到结果:
SELECT MIN(`Client Id`) AS `Client Id`, -- 如需取较大的Id可替换为MAX() MAX(Name) AS Name, MAX(Email) AS Email FROM client_info;
执行后即可得到你预期的输出结果。
扩展:同个字段存在多个非空值需合并
如果某个字段在分组下有多个非空值需要全部保留,可以用字符串拼接聚合函数:
- MySQL环境用
GROUP_CONCAT():
SELECT `Client Id`, GROUP_CONCAT(DISTINCT Name SEPARATOR '/') AS Name, GROUP_CONCAT(DISTINCT Email SEPARATOR '/') AS Email FROM client_info GROUP BY `Client Id`;
- PostgreSQL、SQL Server环境用
STRING_AGG():
SELECT "Client Id", STRING_AGG(DISTINCT Name, '/') AS Name, STRING_AGG(DISTINCT Email, '/') AS Email FROM client_info GROUP BY "Client Id";
内容的提问来源于stack exchange,提问作者Vitor Aranha
相关产品推荐
相关产品推荐

