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

SQL如何按多列分组并将同组非空值合并为单行结果?

问题根因

你之前的SQL写法无法得到预期结果,核心错误是分组维度设置错误:将Rev、Cost、Qty三个待合并的字段全部加入了GROUP BY子句,数据库会按照「Name+Rev+Cost+Qty」的唯一值组合拆分分组,自然无法把同Name下分散在多行的字段值合并到同一行。
另外你写的WHERE Rev IS NOT NULL OR Cost IS NOT NULL OR Qty IS NOT NULL过滤条件其实是多余的——如果某行三个字段全为NULL,聚合后对应的三个字段结果也会是NULL,不会影响最终输出。

正确实现写法

你的数据场景有个明确特征:同一个Name下,Rev、Cost、Qty三个字段各自最多只有1个非空值,其余行对应字段均为NULL。这种场景下只需要按Name单字段分组,搭配会自动忽略NULL值的聚合函数,就能直接拿到合并结果,写法兼容SQL Server、MySQL、PostgreSQL等绝大多数主流数据库:

SELECT
    Name,
    MAX(Rev) AS Rev,
    MAX(Cost) AS Cost,
    MAX(Qty) AS Qty
FROM #table
GROUP BY Name
逻辑说明
  • 聚合函数MAX()在计算时会自动跳过NULL值,由于同Name下每个目标字段只有1个非空值,计算得到的最大值就是该字段唯一的非空有效值
  • 用你提供的示例数据验证:
    • Name为X的3条记录中,Rev列值为1000/NULL/NULL,MAX(Rev)返回1000;Cost列值为NULL/100/NULL,MAX(Cost)返回100;Qty列值为NULL/NULL/3,MAX(Qty)返回3,正好匹配你需要的单行结果
    • Name为Z的3条记录同理,最终返回Rev=300、Cost=80、Qty=8,完全符合预期

注:如果后续出现同Name下某字段有多个非空值的场景,MAX()会返回其中最大的那个值,你可以根据业务需求替换为SUM()(求和)、MIN()(取最小值)等其他聚合函数。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 14:30:57