分摊权重与分配事实表
分摊权重与分配事实表用于把一笔总额按规则摊到明细上:整单运费按商品金额比例摊到每个商品行、整单优惠按件数摊、集团费用按人数摊。做法是在分配事实表里同时存基数、分摊系数与原值,分摊额等于基数乘系数。保留系数而不是只存结果,是为了口径变化后能重算,也便于审计追查每一分钱的来源。
基本信息
| 场景 | 运费、优惠、包装费、平台佣金、公共费用分摊 |
|---|---|
| 要存三列 | 基数、分摊系数、分摊后金额 |
| 系数形态 | 比例值或分子分母,便于重算 |
| 审计要求 | 原始总额与被分摊结果同时保留 |
| 勾稽要求 | 分摊结果汇总必须与原始总额对齐 |
典型使用场景
- 整单运费分摊到商品行:做单品毛利分析时必须把运费摊下去
- 优惠券分摊:整单立减按金额比例分到各商品,避免单品毛利虚高
- 平台佣金分摊:按成交额比例摊到各品类做渠道成本核算
- 公共费用分摊:仓储、客服成本按订单量或体积分摊到业务线
- 多级分摊:先按门店摊到人、再按人摊到订单,需要记录每一级系数
- 口径变更重算:分摊规则调整后靠系数重跑,而不是从原始总账重来
分摊与勾稽
分摊与勾稽
-- 分摊额 = 基数 × 分摊系数
SELECT order_id,
sum(base_amt * alloc_ratio) AS ship_fee
FROM fact_ship_alloc
WHERE dt = '2026-10-11'
GROUP BY order_id;
-- 勾稽校验:分摊结果合计必须等于原始运费总额
SELECT 'alloc_total' AS chk, sum(base_amt * alloc_ratio) AS amt
FROM fact_ship_alloc WHERE dt = '2026-10-11'
UNION ALL
SELECT 'source_total', sum(ship_fee)
FROM ods_order_ship WHERE dt = '2026-10-11';
-- 系数自检:同一单内系数之和应为 1(舍入尾差单独挂到最大金额行)
SELECT order_id, sum(alloc_ratio) FROM fact_ship_alloc
WHERE dt = '2026-10-11' GROUP BY order_id HAVING abs(sum(alloc_ratio) - 1) > 0.0001;分摊方法对照
| 方法 | 依据 | 适用与风险 |
|---|---|---|
| 按金额比例 | 商品成交金额占比 | 最常见;金额为零时系数退化 |
| 按件数 | 商品件数占比 | 件数差异大时高价单品被少摊 |
| 按体积或重量 | 物流属性 | 需要准确的物流属性,常缺数据 |
| 均摊 | 行数等分 | 简单但忽略规模差异,业务接受度低 |
| 固定系数 | 业务直接指定 | 可解释性好,但需人工维护且易过期 |
分摊总额必须能与原始总账勾稽:舍入尾差不要分散在各行,通常把差额调整到金额最大的一行,保证明细相加严格等于总额。分摊只看口径不看对与错,因此规则必须文档化,否则同一份数据换个人摊出不同结果。