SQL查询需求:按9级金额阶梯统计指定日期区间客户付款等级计数
按金额阶梯统计付款客户数量的SQL实现
核心步骤拆解
- 计算单个客户累计付款额:筛选指定日期范围内的付款记录,按客户分组求和,得到每个客户的总付款金额。
- 匹配金额等级:用
CASE WHEN条件语句,把每个客户的总金额映射到对应的9级阶梯中。 - 按等级统计客户数:将匹配好等级的结果按等级分组,统计每个等级下的客户数量。
假设数据表结构
假设你的付款记录表名为payments,包含以下核心字段:
customer_id:客户唯一标识payment_amount:单笔付款金额(数值类型)payment_date:付款日期(日期/时间类型)
完整SQL示例
-- 定义金额阶梯并统计客户数 WITH customer_total_payments AS ( -- 第一步:计算每个客户在指定日期内的总付款额 SELECT customer_id, SUM(payment_amount) AS total_paid FROM payments -- 替换为你的目标日期区间 WHERE payment_date BETWEEN '2023-01-01' AND '2023-12-31' GROUP BY customer_id ) -- 第二步:匹配等级并统计客户数量 SELECT -- 根据实际9级阶梯调整阈值与描述 CASE WHEN total_paid <= 100 THEN '等级1:0-100' WHEN total_paid <= 500 THEN '等级2:101-500' WHEN total_paid <= 1000 THEN '等级3:501-1000' WHEN total_paid <= 2000 THEN '等级4:1001-2000' WHEN total_paid <= 5000 THEN '等级5:2001-5000' WHEN total_paid <= 10000 THEN '等级6:5001-10000' WHEN total_paid <= 20000 THEN '等级7:10001-20000' WHEN total_paid <= 50000 THEN '等级8:20001-50000' ELSE '等级9:50001+' END AS amount_level, COUNT(customer_id) AS customer_count FROM customer_total_payments GROUP BY amount_level -- 可选:按等级顺序排序,避免结果混乱 ORDER BY CASE amount_level WHEN '等级1:0-100' THEN 1 WHEN '等级2:101-500' THEN 2 WHEN '等级3:501-1000' THEN 3 WHEN '等级4:1001-2000' THEN 4 WHEN '等级5:2001-5000' THEN 5 WHEN '等级6:5001-10000' THEN 6 WHEN '等级7:10001-20000' THEN 7 WHEN '等级8:20001-50000' THEN 8 ELSE 9 END;
关键部分解释
- CTE临时结果集:
customer_total_payments用来存储每个客户的累计付款额,拆分逻辑后更容易理解和调试。 - 日期过滤细节:如果你的
payment_date包含时间部分,可把条件改成payment_date >= '2023-01-01' AND payment_date < '2024-01-01',避免漏统计当天最后时刻的付款记录。 - 阶梯自定义:直接修改
CASE WHEN里的金额阈值和等级描述,就能适配你实际的9级标准。 - 排序逻辑:最后的
ORDER BY保证结果按等级1到9的顺序展示,不会出现字符串排序导致的顺序混乱。
新手注意事项
- 确保
payment_amount是数值类型,否则SUM函数会报错。 GROUP BY customer_id会自动合并同一客户的多笔付款,不会重复统计客户。- 如果需要强制显示所有9级(哪怕该等级客户数为0),可以预先定义一个包含所有等级的临时表,再用左连接关联统计结果。
内容的提问来源于stack exchange,提问作者Nicholas Herlick
相关产品推荐
相关产品推荐

