SQL中如何用SUM函数计算分组销售总额?

阿强酱_9862

阿强酱_9862

2026-08-20

924人浏览

原创

GROUP BY后直接用SUM()即可,但必须将SELECT中所有非聚合字段(如product_name、region、year)全部列入GROUP BY子句,否则严格模式下报错;WHERE过滤分组前的行,HAVING过滤分组后的结果;SUM()自动忽略NULL,全NULL时返回NULL,可用COALESCE(SUM(), 0)转为0。

sql中如何用sum函数计算分组销售总额?

GROUP BY 后直接用 SUM() 就行,但必须确保非聚合字段全在 GROUP BY 里

SQL 中计算分组销售总额,核心就是 SUM() 配合 GROUP BY。常见错误是 SELECT 里写了 product_name 和 SUM(sales_amount),却只对 product_id 分组——这在 MySQL 5.7+、PostgreSQL、SQL Server 等严格模式下会报错:ERROR: column "product_name" must appear in the GROUP BY clause or be used in an aggregate function。

正确做法是:所有非聚合列(比如 product_name、region、year)都得出现在 GROUP BY 子句中。

  • 如果按商品名分组,就写 GROUP BY product_name
  • 如果按年份 + 地区分组,就得写 GROUP BY year, region
  • 别依赖 MySQL 5.6 及更早版本的“宽松模式”,它可能返回不可靠的 product_name 值

WHERE 和 HAVING 别混用:过滤行用 WHERE,过滤分组用 HAVING

WHERE 在分组前生效,HAVING 在 SUM() 计算完之后才起作用。想查“2023 年各产品的销售额”,要先用 WHERE year = 2023;但想查“销售额超 10 万的品类”,就得用 HAVING SUM(sales_amount) > 100000。

典型错误是把金额条件写在 WHERE 里,例如 WHERE SUM(sales_amount) > 100000 —— 这会直接报错:ERROR: aggregate functions are not allowed in WHERE。

  • WHERE 可用字段:原始表中的任意列(如 order_date、status)
  • HAVING 可用字段:SELECT 中的别名(如 total_sales)或聚合表达式(如 SUM(sales_amount))
  • 执行顺序固定:FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY

NULL 值会让 SUM() 结果变 NULL?其实不会,但得注意字段本身是否可空

SUM() 会自动忽略 NULL 值,只累加非空数字。但如果整组数据的 sales_amount 全是 NULL,结果就是 NULL,不是 0。这在报表里容易造成空值显示异常。

稳妥做法是用 COALESCE(SUM(sales_amount), 0) 显式转成 0。别用 ISNULL() 或 NVL(),函数名因数据库而异:COALESCE() 是标准 SQL,所有主流数据库都支持。

  • 如果源字段定义为 sales_amount DECIMAL(10,2) NULL,且业务上“未录销售额”和“销售额为 0”含义不同,那保留 NULL 反而是对的
  • 如果只是想避免前端报错或图表空白,COALESCE(SUM(sales_amount), 0) 最安全
  • 别在 SUM() 外套 CAST(... AS INT) 除非真需要截断小数——SUM() 返回类型由输入字段决定,强行转换可能丢精度

性能关键:分组字段要有索引,特别是高基数列慎用

当按 order_id 或 customer_phone 这类高基数(几乎每行都不同)字段分组时,SUM() 会生成大量分组,内存和排序开销陡增。这时候即使加了索引,查询也可能变慢甚至 OOM。

真实场景中,优先按有明确业务意义、低基数的字段分组,比如 product_category、region_code、quarter。如果必须按高基数字段聚合,考虑加 LIMIT 或预聚合到汇总表。

  • 索引建议:在 GROUP BY 字段 + WHERE 条件字段上建联合索引,例如 INDEX idx_region_year (region, year)
  • 避免在 GROUP BY 里用函数,如 GROUP BY YEAR(order_date) —— 会导致索引失效
  • PostgreSQL 用户可关注 EXPLAIN ANALYZE 输出里的 Group Key 和 Sort Method,判断是否走内存排序

实际跑的时候,最常卡在 GROUP BY 字段没对齐或者 HAVING 写成了 WHERE。这两个地方一错,要么报错,要么结果不对,还不好排查。

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

2023.10.12

5023

8

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.27

1031

4

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

2024.02.23

1309

5

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

2024.03.06

7081

10

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

2024.03.06

3743

4

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

2024.04.07

7080

11

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

2024.04.29

9901

6

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

2024.04.29

1350

5

sql中删除一列的命令是什么
sql中删除一列的命令是什么

在sql中,使用alter table语句可以删除一列,语法为:alter table table_name drop column column_name。想了解更多sql的相关内容,可以阅读本专题下面的文章。

2024.04.29

1172

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.7万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 134.3万人学习