数量正负怎么约定
出入库、退款、冲销这类有方向的流动,必须全仓统一符号约定,否则下游各自解读。两种通行做法:单列带符号(出库为负、销售为正),汇总即净额;或分成两列(in_qty、out_qty),方向明确但每次计算净额都要相减。选哪种都可以,关键是把约定写进模型文档并在所有表间保持一致。
基本信息
| 方案 A | 单列带符号,如销量正、退货负 |
|---|---|
| 方案 B | 分列 in_qty / out_qty,方向由列名表达 |
| 校验规则 | 流水合计应等于期末减期初 |
| 文档要求 | 符号约定写入模型说明与字段注释 |
| 跨域注意 | 财务借贷方向另有一套约定 |
| 常见表 | 库存流水、销售明细、退款流水 |
典型使用场景
- 库存结存:用入库正、出库负的流水累计得到结存数量
- 净销量口径:销售数与退货数相加即得净销量,无需相减
- 对账校验:流水合计与库存系统的期末差异逐期核对
- 退款分析:退款必须与销售同表用负值表达,才能算净额
- 成本核算:领料、退料方向不同,符号错误会直接算错成本
符号统一与净额校验
符号统一与净额校验
-- 约定:销量正数、退货负数;净销量 = sum(qty)
SELECT sku_id, sum(qty) AS net_qty
FROM fact_sale
GROUP BY sku_id;
-- 用期初 + 流水 校验期末:差异不为 0 说明流水有缺失或符号写反
SELECT s.sku_id, s.beg_qty + f.flow_qty - s.end_qty AS diff_qty
FROM fact_stock_snapshot s
JOIN (SELECT sku_id, sum(qty) AS flow_qty FROM fact_stock_flow GROUP BY sku_id) f
ON s.sku_id = f.sku_id
WHERE s.snapshot_date = :end_date;两种方案对比
| 对比项 | 单列带符号 | 分列 in/out |
|---|---|---|
| 净额计算 | 直接 sum | 需相减或差集计算 |
| 方向可读性 | 依赖约定,易误读 | 列名即方向,直观 |
| 写入容错 | 符号写反难以发现 | 两列同时有值时可校验 |
| 适用场景 | 流水与净额分析为主 | 入库出库分别考核为主 |
财务域的借贷方向与业务数量方向是两套约定:借方与贷方在报表里常用两列表达,跨域使用时必须在指标层显式转换,不能把财务金额与业务数量直接相加。
同一业务在不同来源系统里的符号常常相反(WMS 出库为正、ERP 出库为负),入仓时统一转换,并在 ETL 里写明转换位置,避免下游再叠加一次取反。