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

DB2 SQL如何按组汇总每列非null值并返回期望的多行结果

SQL实现同分组多列非null值展开多行输出

核心实现逻辑

你当前用GROUP BY + MAX只能返回每组一行的聚合结果,要实现每组输出多行、保留所有非null值的效果,需要通过窗口函数为各列非null值编号后拼接,具体逻辑:

  • 对col1、col2、col3分别做子查询,仅保留对应列非null的记录,在id+name分组内为每条记录分配连续行号
  • 三个子查询通过id、name、行号做全外连接,无对应行号的列自动返回null
  • 最终每组的输出行数等于该组三个列非null值的最大数量

可运行SQL示例(适配MySQL8.0+、PostgreSQL、Oracle、SQL Server等支持窗口函数的数据库)

SELECT 
  COALESCE(t1.id, t2.id, t3.id) AS id,
  COALESCE(t1.name, t2.name, t3.name) AS name,
  t1.col1,
  t2.col2,
  t3.col3
FROM 
  -- 处理col1的非null值并编号
  (SELECT 
    id, name, col1,
    ROW_NUMBER() OVER(PARTITION BY id, name ORDER BY col1) AS rn 
   FROM your_table 
   WHERE col1 IS NOT NULL) t1
FULL OUTER JOIN
  -- 处理col2的非null值并编号
  (SELECT 
    id, name, col2,
    ROW_NUMBER() OVER(PARTITION BY id, name ORDER BY col2) AS rn 
   FROM your_table 
   WHERE col2 IS NOT NULL) t2
ON t1.id = t2.id AND t1.name = t2.name AND t1.rn = t2.rn
FULL OUTER JOIN
  -- 处理col3的非null值并编号
  (SELECT 
    id, name, col3,
    ROW_NUMBER() OVER(PARTITION BY id, name ORDER BY col3) AS rn 
   FROM your_table 
   WHERE col3 IS NOT NULL) t3
ON COALESCE(t1.id, t2.id) = t3.id AND COALESCE(t1.name, t2.name) = t3.name AND COALESCE(t1.rn, t2.rn) = t3.rn
ORDER BY id, name, COALESCE(t1.rn, t2.rn, t3.rn);

请将代码中的your_table替换为实际业务表名,ROW_NUMBER中ORDER BY后的排序规则可按实际业务需求修改,比如替换为原表主键、创建时间字段即可保留值的原始出现顺序。

低版本MySQL适配方案

如果使用的是不支持窗口函数的MySQL5.x及更低版本,可通过自定义变量模拟行号实现相同逻辑,核心逻辑和上述方案一致。

内容的提问来源于stack exchange,提问作者Salva

相关产品推荐
方舟 Agent Plan

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

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