You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Snowflake中计算库存供应天数(DOS)的SQL查询问题

修正SQL以计算库存供应天数(DOS)

需求定义

库存供应天数(DOS)指当日库存可覆盖的后续日期Forecast总天数,规则如下:

  • 从当日的次日开始,依次累加每日Forecast,直到累加总和超过当日库存时停止,统计已累加的天数
  • 若当日库存不足以覆盖次日的Forecast,DOS为0

示例:

  • 2025年1月23日库存700,可覆盖后续3天Forecast(200+300+100=600 ≤700),DOS为3
  • 2025年1月24日库存600,可覆盖后续2天Forecast(300+100=400 ≤600),DOS为2

原始数据

LocationMaterialStart_DateInventoryForecast
W011234561/23/2025700400
W011234561/24/2025600200
W011234561/25/2025400300
W011234561/26/2025450100
W011234561/27/202550300

期望输出

LocationMaterialStart_DateInventoryForecastDOS
W011234561/23/20257004003
W011234561/24/20256002002
W011234561/25/20254003002
W011234561/26/20254501001
W011234561/27/2025503000

原SQL的问题

  1. 语法错误:多处子查询的WHERE条件缺少闭合的双引号和括号,例如WHERE "B"."START_DATE" >= "A"."START_DATE
  2. 逻辑错误:DOS计算用库存除以未来总需求,不符合“累加后续Forecast统计天数”的核心需求
  3. 关联缺失:未对Location和Material做关联过滤,会导致跨物料/地点计算需求,违背业务逻辑
  4. 范围错误:FUTURE_DEMAND包含了当日Forecast,但需求中是用库存覆盖次日及之后的Forecast

修正后的SQL

SELECT
    a.Location,
    a.Material,
    a.Start_Date,
    a.Inventory,
    a.Forecast,
    COUNT(b.Start_Date) AS DOS
FROM your_table_name a
LEFT JOIN your_table_name b
    ON a.Location = b.Location
    AND a.Material = b.Material
    AND b.Start_Date > a.Start_Date
WHERE (
    SELECT SUM(c.Forecast)
    FROM your_table_name c
    WHERE c.Location = a.Location
      AND c.Material = a.Material
      AND c.Start_Date > a.Start_Date
      AND c.Start_Date <= b.Start_Date
) <= a.Inventory
GROUP BY a.Location, a.Material, a.Start_Date, a.Inventory, a.Forecast
ORDER BY a.Start_Date;

注:将your_table_name替换为实际表名

逻辑说明

  1. 通过自连接关联同物料、同地点的后续日期数据
  2. 对每个日期,累加其后续每日的Forecast,判断累加和是否不超过当日库存
  3. 统计满足条件的后续日期数量,即为DOS;若没有满足条件的日期,返回0

内容的提问来源于stack exchange,提问作者Yu Ching Tsoi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 17:04:52