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

如何按正负条件分组统计amount字段的总和与记录数?

解决SQL正负值分组统计的问题

嘿,作为SQL新手遇到这种分组统计的问题太正常啦,我给你准备了两个简单易懂的方案,你可以根据自己的习惯选一个用~

方案一:用CASE + GROUP BY 一次性统计

这种写法更简洁,通过CASE语句给每条数据打「分组标签」,再按标签批量统计:

SELECT
  CASE
    WHEN amount > 0 THEN '正数'
    WHEN amount < 0 THEN '负数'
  END AS 数据类型,
  SUM(amount) AS 金额总和,
  COUNT(*) AS 记录条数
FROM exampleTable
-- 如果不需要排除金额为0的记录,直接删掉下面这行WHERE条件即可
WHERE amount != 0
GROUP BY
  CASE
    WHEN amount > 0 THEN '正数'
    WHEN amount < 0 THEN '负数'
  END;

小说明:

  • CASE语句会自动把每条记录归类到「正数」或「负数」组里
  • SUM(amount)负责计算每组的金额总和,COUNT(*)统计每组的记录数量
  • 要是想额外统计金额为0的记录,只要在CASE里加一个WHEN amount = 0 THEN '零'的分支就行

方案二:用UNION ALL 拆分查询(新手友好款)

如果觉得分组写法有点绕,你可以把正数和负数的统计拆成两个独立查询,再用UNION ALL把结果拼起来,每一步都一目了然:

-- 单独统计正数的总和与记录数
SELECT
  '正数' AS 数据类型,
  SUM(amount) AS 金额总和,
  COUNT(*) AS 记录条数
FROM exampleTable
WHERE amount > 0

UNION ALL

-- 单独统计负数的总和与记录数
SELECT
  '负数' AS 数据类型,
  SUM(amount) AS 金额总和,
  COUNT(*) AS 记录条数
FROM exampleTable
WHERE amount < 0;

小说明:

  • 两个SELECT分别负责一组数据的统计,逻辑完全独立
  • UNION ALL会把两个结果集上下拼接成两行,注意两个查询的列数、列类型必须保持一致哦

额外提醒:如果你的amount字段存在NULL值,COUNT(*)会把这些NULL记录算进去,但SUM(amount)会自动忽略NULL。如果要排除NULL,可以在WHERE条件里加AND amount IS NOT NULL。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:45:53