账单事实建模要点
账单是财务域的核心业务过程,关注账期、应收、实收与状态流转。建模时金额要按口径拆列:应收金额、实收金额、退款金额分别成列,不能混在一个 amount 字段里靠状态区分。时间上账期日与到账日是两个不同概念,属于同一日期维度的角色扮演,必须分开存储,否则逾期分析会整体失真。账单事实还要与交易域建立勾稽关系,让金额闭合可被验证。
基本信息
| 粒度 | 一行 = 一张账单(bill_no) |
|---|---|
| 关键要素 | 账期、状态、应收/实收/退款三套金额 |
| 时间角色 | 账期日与到账日,同一日期维度两个外键 |
| 勾稽关系 | 与交易域订单金额按账期与用户对齐校验 |
| 更新方式 | 状态与实收金额随回款推进更新,属累积快照形态 |
典型使用场景
- 应收管理:按账期与客户维度汇总应收余额,支撑催收优先级排序
- 回款分析:实收金额按到账日统计,与财务流水按日核对
- 逾期测算:账期日与到账日分开后,逾期天数与账龄可稳定计算
- 业财勾稽:账单金额与交易域订单金额按用户与账期对齐,差异可定位
- 退款核算:退款金额独立成列后,净收入与退款率不必再猜口径
账单事实表结构
账单事实表结构
-- 粒度:一行 = 一张账单
-- fact_bill(bill_no, period_key, due_date_key, paid_date_key,
-- due_amt, paid_amt, refund_amt, status, user_sk)
SELECT b.period_key, -- 账期维度键
sum(b.due_amt) AS due_total, -- 应收合计
sum(b.paid_amt) AS paid_total, -- 实收合计
sum(b.due_amt) - sum(b.paid_amt) AS open_amt -- 未收余额
FROM fact_bill b
WHERE b.period_key = '2026-09'
GROUP BY 1;
-- 逾期天数计算需用账期日而非到账日,两列必须分开存储金额口径对照
| 字段 | 含义 | 常见误用 |
|---|---|---|
| due_amt | 本期应收金额,含税口径 | 与实收混列导致余额算错 |
| paid_amt | 已到账金额,按到账日累计 | 用账期日统计,跨期错位 |
| refund_amt | 本期发生的退款金额 | 冲减应收而非单独列示 |
| open_amt | 应收减实收的未收余额 | 与逾期金额混为一谈 |
账期与到账时间混用一个字段,是财务域最常见的建模问题:短期看不出异常,一旦做逾期与账龄分析,整体结论都会偏移。
账单事实与交易域事实不能按明细直接 join,应按用户与账期分别聚合后再对齐,否则多对多会把金额放大。