首页/数据/数仓建模速查/数量正负与借贷方向约定
维度与事实设计149 条

数量正负与借贷方向约定

出入库、退款等正负流动要全仓统一:或分列(入量/出量)、或带符号单列;符号约定写进模型文档,避免下游各自解读。

数仓建模速查数据更新于 2026-10-13

数量正负怎么约定

出入库、退款、冲销这类有方向的流动,必须全仓统一符号约定,否则下游各自解读。两种通行做法:单列带符号(出库为负、销售为正),汇总即净额;或分成两列(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 里写明转换位置,避免下游再叠加一次取反。

易错点

  • 来源系统符号不一致且未做转换,汇总时正负抵消,数量凭空变小
  • 退货单另建一张表按增量计算,销售与退货两套口径重复计算
  • 符号约定只存在于代码里,没写进字段注释,新接手的人按直觉取反
  • 含符号列直接用于求占比、平均等计算,出现负值占比这类无意义结果

数据来源与参考

  • 数仓建模实践:度量的符号约定
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌