求助:编写含3个月取款排除条件的合伙人月度奖金计算SQL脚本
合作伙伴月度奖金计算SQL实现
核心逻辑
奖金计算公式为:(有效存款总额 - 符合扣减条件的取款总额) * 0.5%,其中符合扣减条件的取款指取款时间与对应存款时间间隔≤3个月的取款记录。
假设数据表结构
基于业务场景,假设存在以下基础表:
partners:partner_id(主键)、partner_name(合作伙伴名称)customers:customer_id(主键)、partner_id(关联所属合作伙伴)deposits:deposit_id(主键)、customer_id(关联客户)、amount(存款金额)、deposit_date(存款日期)withdrawals:withdrawal_id(主键)、customer_id(关联客户)、amount(取款金额)、withdrawal_date(取款日期)、deposit_id(关联对应的存款记录)
SQL脚本(以MySQL为例)
SELECT p.partner_id, p.partner_name, DATE_FORMAT(d.deposit_date, '%Y-%m') AS bonus_month, SUM( (d.amount - COALESCE(SUM(CASE WHEN TIMESTAMPDIFF(MONTH, d.deposit_date, w.withdrawal_date) <= 3 THEN w.amount ELSE 0 END), 0)) * 0.005 ) AS monthly_bonus FROM deposits d LEFT JOIN withdrawals w ON d.deposit_id = w.deposit_id JOIN customers c ON d.customer_id = c.customer_id JOIN partners p ON c.partner_id = p.partner_id GROUP BY p.partner_id, p.partner_name, DATE_FORMAT(d.deposit_date, '%Y-%m') ORDER BY bonus_month, p.partner_id;
脚本说明
- 关联表与筛选有效取款:通过
LEFT JOIN关联存款和对应的取款记录,用TIMESTAMPDIFF计算月份间隔,仅保留间隔≤3个月的取款金额用于扣减。 - 处理空值:用
COALESCE确保无对应取款的存款记录不会因NULL值导致计算错误。 - 分组汇总:按合作伙伴和存款所在月份分组,计算每组的月度奖金总额。
适配其他数据库的调整
- PostgreSQL:将
TIMESTAMPDIFF(MONTH, d.deposit_date, w.withdrawal_date)替换为DATE_PART('month', age(w.withdrawal_date, d.deposit_date)),DATE_FORMAT替换为TO_CHAR(d.deposit_date, 'YYYY-MM')。 - SQL Server:将
TIMESTAMPDIFF(MONTH, d.deposit_date, w.withdrawal_date)替换为DATEDIFF(month, d.deposit_date, w.withdrawal_date),DATE_FORMAT替换为FORMAT(d.deposit_date, 'yyyy-MM')。
内容的提问来源于stack exchange,提问作者JustJump
相关产品推荐
相关产品推荐

