求助:在Microsoft SQL Server 2019中按10岁间隔分组统计客户销售额总和
按10岁间隔分组统计销售额总和(SQL Server 2019)
针对你的需求,这里提供两种在SQL Server 2019中实现按10岁间隔分组并统计销售额总和的方案:
方法一:使用FLOOR函数自动生成区间
这种方法适合规则的10岁间隔分组,无需手动枚举所有区间,代码更简洁:
SELECT -- 生成如"40-49"格式的年龄区间文本 CONCAT(FLOOR(age / 10) * 10, '-', FLOOR(age / 10) * 10 + 9) AS age_group, -- 统计每组销售额总和 SUM(sales_amount) AS total_sales FROM customers -- 替换为你的实际表名 GROUP BY FLOOR(age / 10) * 10 -- 按计算后的区间起始值分组 ORDER BY age_group; -- 按区间排序
说明:
FLOOR(age / 10) * 10会将年龄转换为对应区间的起始值(例如45→40,52→50)- 分组时使用这个计算值而非拼接后的字符串,避免因字符串排序或格式问题导致分组错误
- 若存在年龄为0-9岁的客户,会自动生成"0-9"的区间
方法二:使用CASE语句自定义区间
如果需要对特定区间做自定义处理(例如将60岁及以上合并为一组),可以用CASE语句手动指定分组规则:
SELECT CASE WHEN age BETWEEN 0 AND 9 THEN '0-9' WHEN age BETWEEN 10 AND 19 THEN '10-19' WHEN age BETWEEN 20 AND 29 THEN '20-29' WHEN age BETWEEN 30 AND 39 THEN '30-39' WHEN age BETWEEN 40 AND 49 THEN '40-49' WHEN age BETWEEN 50 AND 59 THEN '50-59' ELSE '60+' -- 自定义60岁及以上的分组名称 END AS age_group, SUM(sales_amount) AS total_sales FROM customers -- 替换为你的实际表名 GROUP BY -- GROUP BY需与SELECT中的CASE逻辑完全一致 CASE WHEN age BETWEEN 0 AND 9 THEN '0-9' WHEN age BETWEEN 10 AND 19 THEN '10-19' WHEN age BETWEEN 20 AND 29 THEN '20-29' WHEN age BETWEEN 30 AND 39 THEN '30-39' WHEN age BETWEEN 40 AND 49 THEN '40-49' WHEN age BETWEEN 50 AND 59 THEN '50-59' ELSE '60+' END ORDER BY age_group;
注意事项:
- 确保
age字段为数值类型(INT/DECIMAL),若存储为字符串,需先转换:CAST(age AS INT) - 若存在
age为NULL的记录,上述查询会自动排除;如需统计这类记录,可在CASE中添加WHEN age IS NULL THEN '未知年龄'分支 - 排序时,方法一可直接用
ORDER BY FLOOR(age/10)*10,比字符串排序更精准
内容的提问来源于stack exchange,提问作者ier
相关产品推荐
相关产品推荐

