如何按正负条件分组统计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
相关产品推荐
相关产品推荐

