You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 12:06:03