如何对OrderDetails表按Order Value区间分组统计对应记录数量
实现方案
你可以使用标准SQL的CASE WHEN语法完成自定义区间分组统计,该写法兼容所有主流关系型数据库(MySQL、PostgreSQL、SQL Server、Oracle等),具体语句如下:
SELECT CASE WHEN `Order Value` BETWEEN 1 AND 2000 THEN 'Between 1 to 2000' WHEN `Order Value` BETWEEN 2001 AND 4000 THEN 'Between 2001 to 4000' WHEN `Order Value` BETWEEN 4001 AND 7000 THEN 'Between 4001 to 7000' WHEN `Order Value` BETWEEN 7001 AND 10000 THEN 'Between 7001 to 10000' WHEN `Order Value` >= 10001 THEN 'Above 10001' END AS `Order Value Group`, COUNT(*) AS `Count` FROM OrderDetails GROUP BY `Order Value Group` ORDER BY CASE `Order Value Group` WHEN 'Between 1 to 2000' THEN 1 WHEN 'Between 2001 to 4000' THEN 2 WHEN 'Between 4001 to 7000' THEN 3 WHEN 'Between 7001 to 10000' THEN 4 WHEN 'Above 10001' THEN 5 END;
代码说明
- 用
CASE WHEN对Order Value字段按指定区间做映射,生成对应分组名称 - 用
COUNT(*)统计每个分组的记录数 - 末尾的排序逻辑是为了保证输出的分组顺序和预期一致,避免数据库默认按字符串排序出现顺序错乱问题
- 如果你实际使用的表字段名没有空格,可以去掉字段名外层的反引号按需调整即可
如果使用PostgreSQL、Oracle这类支持WIDTH_BUCKET函数的数据库,也可以用该函数快速生成区间分组,写法更简洁,但自定义区间的灵活度不如CASE WHEN高。
内容的提问来源于stack exchange,提问作者raghav bansal
相关产品推荐
相关产品推荐

