SQL实现各付款方逾期超90天应收账款占总金额比例计算问题
问题修正与实现方案
你原来的SQL存在几处语法逻辑错误:
- 聚合函数
sum()前不需要加表别名前缀t1. - 列名包含空格、特殊字符时需要用对应数据库的标识符包裹(MySQL用反引号
`、SQL Server用方括号[]、Oracle用双引号") - 子查询统计范围不符合需求,且存在语法错误未闭合
- 过滤条件的列名没有按规范处理空格
以下是按你需求实现的可运行SQL,用窗口函数实现性能更优,同时保留原始行维度展示每个payor对应的超90天应收账款占比:
-- 以下为MySQL语法示例,其他数据库仅需修改列名包裹符即可 SELECT payor, ar_date_string, `AR range`, `days out`, amount, -- 按payor维度统计超90天总额 / 全量应收账款总金额,得到百分比 ROUND( SUM(IF(`days out`>90, amount, 0)) OVER(PARTITION BY payor) / SUM(amount) OVER() * 100, 2 ) AS overdue_90d_percent FROM t1
如果仅需要输出超90天的历史应收账款行,可追加WHERE过滤条件:
SELECT payor, ar_date_string, `AR range`, `days out`, amount, ROUND( SUM(amount) OVER(PARTITION BY payor) / SUM(amount) OVER() * 100, 2 ) AS overdue_90d_percent FROM t1 WHERE `AR range` = 'historical AR' AND `days out` > 90
样例数据计算结果说明
你提供的样例数据总金额为330美元:
- lowes超90天金额为100美元,对应占比为30.30%
- jcp超90天金额为50美元,对应占比为15.15%
内容的提问来源于stack exchange,提问作者maverick
相关产品推荐
相关产品推荐

