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

MySQL中使用GROUP BY计算同一列内不同行的数值差值

解决方案:按用户计算销售与退货的金额差值

嘿,我来帮你搞定这个需求!要实现按name分组,计算销售总额减去退货总额(只有单一类型时直接取总额),用条件聚合就可以轻松完成,下面是具体的实现思路和代码:

核心思路

我们可以通过CASE语句给不同类型的amount赋予正负值,再用SUM函数按name聚合,这样就能自动得到「销售总和 - 退货总和」的结果:

  • 当type为sale时,保留amount的正值
  • 当type为return时,将amount转为负值
  • 最后对每个用户的所有记录求和,就是我们需要的结果

实现代码

SELECT
    name,
    SUM(
        CASE type
            WHEN 'sale' THEN amount
            WHEN 'return' THEN -amount
            ELSE 0
        END
    ) AS amount
FROM your_table_name
GROUP BY name
ORDER BY name;

代码解释

  1. 分组逻辑:GROUP BY name确保我们按每个用户单独计算
  2. 条件求和:
    • 遇到sale类型,直接累加amount
    • 遇到return类型,累加-amount(相当于从销售总额中扣除退货金额)
    • 其他未知类型(如果有的话)按0处理,不影响结果
  3. 结果验证:
    • sam:(2+15) - 3 = 14
    • lilly:25 - 20 = 5
    • anju:20(无退货,直接取销售总额)
      完全符合你需要的输出结果!

补充:用分区窗口函数的实现方式

如果你一定要用到PARTITION操作,也可以先按用户和类型分区计算总和,再分组相减:

WITH type_totals AS (
    SELECT
        name,
        type,
        SUM(amount) OVER(PARTITION BY name, type) AS total
    FROM your_table_name
)
SELECT
    name,
    SUM(CASE type WHEN 'sale' THEN total WHEN 'return' THEN -total ELSE 0 END) AS amount
FROM type_totals
GROUP BY name
ORDER BY name;

不过这种方式相对繁琐,优先推荐第一种条件聚合的写法。

内容的提问来源于stack exchange,提问作者Anju L S

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 13:22:29