Oracle SQL:计算客户近4个月应付金额平均值问题求助
问题:计算客户近4个月应付金额平均值的SQL修正需求
需求说明:
- 计算每个客户近4个月的应付金额平均值
- 特殊情况:VENDOR_INVOICE_NUMBER=3仅存在2个月历史数据,取这2个月的平均值
用户尝试了以下Oracle SQL语句,但未得到预期结果,寻求技术建议:
select vendor_invoice_number, vendor_invoice_number_1 as vendor_invoice_number_date, date, amount_due, avg(amount_due) over (order by to_date(date, 'dd-mon-yy') range between interval '4' month preceding and current row) as average from test_915 order by date desc;
问题分析与修正方案
核心问题
原SQL的窗口函数未按vendor_invoice_number(客户)分区,导致计算的是全局所有客户的近4个月金额平均值,而非单个客户的独立平均值,这是不符合需求的核心原因。另外,若date字段本身为日期类型,多余的to_date转换可能引发隐式类型转换问题。
修正后的SQL语句
select vendor_invoice_number, vendor_invoice_number_1 as vendor_invoice_number_date, date, amount_due, avg(amount_due) over ( partition by vendor_invoice_number -- 按客户分组,确保计算单个客户的独立平均值 order by trunc(to_date(date, 'dd-mon-yy'), 'mm') -- 按月份截断排序,匹配自然月统计逻辑 range between interval '4' month preceding and current row ) as average from test_915 order by date desc;
补充说明
- 若
date字段本身就是DATE类型,直接使用trunc(date, 'mm')即可,无需to_date转换 - 对于VENDOR_INVOICE_NUMBER=3的特殊情况,窗口函数会自动取该客户已有的2个月数据计算平均值,无需额外处理
- 如果需求是“近4个完整自然月”而非“当前日期往前推4个月的区间”,可根据实际场景调整窗口排序或范围逻辑
内容的提问来源于stack exchange,提问作者Bruce
相关产品推荐
相关产品推荐

