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
相关产品推荐
相关产品推荐

