【问题标题】:Need to subtract until value reaches limit / predict when inventory runs out需要减去直到值达到限制/预测库存何时用完
【发布时间】:2018-10-17 19:54:08
【问题描述】:

我正在处理具有以下两个表的查询: 表A:

Store       NumItems
1           500
2           1000
3           575 

表 B:

Store   Day             ItemsSold
1       Monday          100
1       Tuesday         200
1       Wednesday       110
1       Thursday        10
1       Friday          1
1       Saturday        140
1       Sunday          90
2       Monday          400
2       Tuesday         150
2       Wednesday       501
2       Thursday        190
2       Friday          600
2       Saturday        180
2       Sunday          21
3       Monday          100
3       Tuesday         1050
3       Wednesday       108
3       Thursday        102
3       Friday          51
3       Saturday        40
3       Sunday          15

我需要能够判断商店何时会用完商品。我可以获得我运行流程的星期几,但我需要循环或以某种方式继续从每个商店和庄园中减去(假设这是在周一运行 - 商店 1 将在周六用完商店 1 上的商品, 2号店周三售完,3号店周二售完)。

提前谢谢大家的帮助!!!

【问题讨论】:

  • 输出应该是什么样的?除了day 之外,是否还有一列可以指定表 B 中的排序?
  • 我们是否应该假设 NumItems 可能大于一周所售商品的价值?
  • @hatchet7 - 是的,NumItems 可以超过 1 周的价值。

标签: sql sql-server while-loop


【解决方案1】:

你可以试试这个。

编写 CTE 计算每天累积的差异量。然后在查询中获取 Get the maximum negative 。

;WITH CTE AS(
    SELECT * 
    FROM(
        SELECT a.Store,a.NumItems,b.Day, a.NumItems- SUM(b.ItemsSold) 
                                            OVER(PARTITION BY B.Store  
                                                    order by case when b.day='Monday'    then 1
                                                                  when b.day='Tuesday'   then 2
                                                                  when b.day='Wednesday' then 3
                                                                  when b.day='Thursday'  then 4
                                                                  when b.day='Friday'    then 5
                                                                  when b.day='Saturday'  then 6
                                                                  when b.day='Sunday'    then 7
                                                end
                                            ROWS BETWEEN UNBOUNDED PRECEDING  AND CURRENT ROW) diffVal
        FROM A 
        INNER JOIN B ON A.Store = B.Store
    )t
)
SELECT t.Store,t.Day 
FROM CTE t
WHERE exists (SELECT MAX(diffVal) FROM CTE WHERE diffVal < 0 GROUP BY Store HAVING t.diffVal = MAX(diffVal))

sqlfiddle:http://sqlfiddle.com/#!18/2a472/1

【讨论】:

    【解决方案2】:

    假设支持sum窗口功能,你可以这样做

    select top 1 with ties store,day
    from (select a.store,b.day,
          a.numItems-sum(b.itemsSold) over(partition by b.store 
                                           order by case when b.day='Monday' then 1
                                                         when b.day='Tuesday' then 2
                                                         --/*fill remaining values*/...
                                                    end
                                          ) as rem
          from tblA a
          join tblB b on a.store=b.store
         ) t 
    where rem <= 0
    order by row_number() over(partition by store order by rem desc) 
    

    这个想法是从day order 中的项目总数中减去 itemsSold 的运行总数,并获得差异为

    【讨论】:

    • 用一周的总数来修改 numItems 是否明智?
    • @Vamsi Prabhala 结果应该是商店编号,Dayruns out。示例 1 星期六
    【解决方案3】:

    你只需要一个累积和:

    select b.*
    from a join
         (select b.*,
                 sum(itemsold) over (partition by store order by date) as running_itemssold
          from b
         ) b
         on a.store = b.store
    where a.numitems > b.running_itemssold - itemsold and
          a.numitems <= b.running_itemsold;
    

    这将在商品数量达到零时计算售罄。如果您确实需要缩短某个项目,则需要更改条件,以便第二个是&lt; 而不是&lt;=

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多