SQL中如何按价格区间分组统计商品数量

星磊君_4387

星磊君_4387

2026-08-06

719人浏览

原创

最通用做法是用case when将价格映射为标签(如“低价”“中价”“高价”)后再group by;需注意边界等号、null处理及避免表达式导致索引失效。

sql中如何按价格区间分组统计商品数量

用 CASE WHEN 配合 GROUP BY 实现价格分组统计

直接在 GROUP BY 里写区间表达式会报错,必须先用 CASE WHEN 把价格映射成可分组的标签(比如“低价”“中价”“高价”),再对这个标签分组。这是最通用、兼容性最好的做法,MySQL、PostgreSQL、SQL Server 都支持。

  • CASE WHEN price 是核心逻辑,注意边界是否包含等号,避免漏掉等于临界值的记录
  • 别在 SELECT 和 GROUP BY 里重复写整个 CASE 表达式——可以起别名(如 AS price_range),但多数数据库不支持在 GROUP BY 中直接引用 SELECT 别名,稳妥起见还是在 GROUP BY 里重写一遍 CASE
  • 如果区间很多(比如按每50元一段),手写 CASE 易出错,可考虑用 FLOOR(price / 50) 生成分组编号,再拼接描述,但要注意负数和零价商品的处理

用 WIDTH_BUCKET(Oracle/PostgreSQL)快速划分等宽区间

WIDTH_BUCKET 是专为数值分桶设计的函数,比手写 CASE 更简洁,但仅限 Oracle 和较新版本的 PostgreSQL。它能自动把数值线性划分为指定数量的等宽桶,返回桶编号(从1开始)。

  • 语法是 WIDTH_BUCKET(price, 0, 1000, 5):表示把 0–1000 元区间均分为 5 桶,价格小于0进第0桶,大于1000进第6桶——这两个“越界桶”需要单独处理或过滤
  • 结果只是数字编号(1~5),要转成可读名称还得套一层 CASE 或 VALUES 查表,不能直接当分组标签用
  • 如果最大最小值不确定,用子查询先算出 MIN(price) 和 MAX(price) 再传入,但会导致查询变慢,且无法索引加速

WHERE 过滤和 NULL 值必须提前处理

价格字段为 NULL 时,CASE WHEN 所有分支都不匹配,结果为 NULL,最终会单独聚合成一行“数量=某值”,容易被误认为是有效区间。这不是 bug,是 SQL 的三值逻辑决定的。

  • 加 WHERE price IS NOT NULL 最干脆,适合业务上不允许空价格的场景
  • 若需保留空值统计,显式加一个 WHEN price IS NULL THEN '未知' 分支,并确保该分支在所有数值判断之后(否则会被前面的 WHEN 拦截)
  • 别依赖 HAVING COUNT(*) > 0 来排除空分组——它只过滤聚合后结果,不影响 NULL 被分到哪一组

性能关键:别让分组逻辑阻止索引使用

在 WHERE 条件里对 price 做范围过滤(如 price BETWEEN 100 AND 500)通常能走索引;但一旦把 price 套进函数或表达式(比如 FLOOR(price/100) 或 CASE WHEN),就无法利用 price 字段的索引,全表扫描风险陡增。

  • 优先在 WHERE 子句里缩小数据集,再做分组,例如先 WHERE price >= 0 排除负数和 NULL,再分组
  • 如果查询高频且区间固定,可建生成列(MySQL 5.7+、PostgreSQL 12+)或计算字段并为其建索引,例如 ALTER TABLE products ADD COLUMN price_level VARCHAR(10) AS (CASE WHEN price
  • 千万级表慎用 WIDTH_BUCKET 配合子查询算动态边界,执行计划里容易出现 Materialize,内存和时间成本都高
实际写的时候,第一种 CASE WHEN + GROUP BY 覆盖 95% 场景;真正卡性能时,才值得花精力评估生成列或物化视图。区间定义看似简单,但边界取舍、NULL 处理、索引失效这三点,上线后最容易引发数据对不上。
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

4463

8

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

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

2023.10.27

931

4

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

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

2024.02.23

1169

5

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

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

2024.03.06

6421

10

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

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

2024.03.06

3223

4

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

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

2024.04.07

6380

11

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

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

2024.04.29

8721

6

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

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

2024.04.29

1190

5

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

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

2024.04.29

1032

5

热门下载

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

精品课程

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

共6课时 | 54.7万人学习

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

共89课时 | 133.9万人学习