【问题标题】:My SQL Query Seems to be in a loop我的 SQL 查询似乎处于循环中
【发布时间】:2014-03-07 03:56:35
【问题描述】:

我有一张表格,列出了我的库存中的物品,total quantity on handordered qtyship date

+-------+-----------+------------+----------+ |项目 |手上数量 |订购数量 |发货日期 | +-------+-----------+------------+----------+ |意达 | 100 | 80 | 2014 年 3 月 4 日 | |项目 | 80 | 220 | 2014 年 3 月 8 日 | |意达 | 100 | 80 | 2014 年 3 月 10 日 | |项目 | 80 | 100 | 2014 年 3 月 12 日 | +-------+-----------+------------+----------+

我正在尝试创建一个查询,该查询将按日期 (PromiseDate) 订单中的项目滚动销售订单。使用已知的库存量 (QtyOnHand) 减去每个订单的 QtyOrdered 数量,并在减去 QtyOrdered 后保持 QtyOnHand 的运行总数,并且仅在 QtyOnHand

处理完以下数据后,我的新表应该包含两条记录,每条记录代表该物品将用完库存的日期。

请帮忙。 谢谢

CREATE TABLE #OverInv (Item VARCHAR(15), PromiseDate DATETIME, QtyOnHand INT, QtyOrdered INT, TotalOver INT) 
DECLARE @Item VARCHAR(15),
 @PromiseDate DATETIME,
 @QtyOrdered INT,
 @QtyOnHand INT,
 @CurrentItem VARCHAR(15),
 @TotalOver INT 

 SET @TotalOver = 0
 SET @CurrentItem = 0

 DECLARE rt_cursor CURSOR 
 FOR 
 SELECT Item, PromiseDate, QtyOrdered, QtyOnHand 
 FROM Inventory 

 OPEN rt_cursor 

 FETCH NEXT FROM rt_cursor INTO @Item,@PromiseDate,@QtyOrdered,@QtyOnHand 
 WHILE @@FETCH_STATUS = 0

IF @CurrentItem = 0
  BEGIN 
    SET @CurrentItem = @Item
    SET @TotalOver = (@QtyOnHand - @QtyOrdered)

    IF @TotalOver < 1 
       BEGIN
          INSERT #OverInv VALUES (@Item,@PromiseDate,@QtyOnHand,@QtyOrdered,@TotalOver) 
          FETCH NEXT FROM rt_cursor INTO @Item,@PromiseDate,@QtyOrdered,@QtyOnHand 
          SET @TotalOver = 0
       END
    ELSE
       BEGIN
          FETCH NEXT FROM rt_cursor INTO @Item,@PromiseDate,@QtyOrdered,@QtyOnHand
       END
  END

IF @CurrentItem = @Item
  SET @TotalOver = (@TotalOver - @QtyOrdered)
  BEGIN
    IF @TotalOver < 1
       BEGIN
         INSERT #OverInv VALUES (@Item,@PromiseDate,@QtyOnHand,@QtyOrdered,@TotalOver) 
         FETCH NEXT FROM rt_cursor INTO @Item,@PromiseDate,@QtyOrdered,@QtyOnHand 
         SET @TotalOver = 0
       END
    ELSE
       BEGIN
         FETCH NEXT FROM rt_cursor INTO @Item,@PromiseDate,@QtyOrdered,@QtyOnHand
       END
  END

IF @CurrentItem <> @Item
   SET @CurrentItem = @Item
   SET @TotalOver = (@QtyOnHand - @QtyOrdered)
   BEGIN  
     IF @TotalOver < 1 
        BEGIN
          INSERT #OverInv VALUES (@Item,@PromiseDate,@QtyOnHand,@QtyOrdered,@TotalOver) 
          FETCH NEXT FROM rt_cursor INTO @Item,@PromiseDate,@QtyOrdered,@QtyOnHand 
          SET @TotalOver = 0
        END
     ELSE
       BEGIN
         FETCH NEXT FROM rt_cursor INTO @Item,@PromiseDate,@QtyOrdered,@QtyOnHand
       END
   END


CLOSE rt_cursor 
DEALLOCATE rt_cursor 

SELECT * FROM #OverInv ORDER BY Item 

DROP TABLE #OverInv

【问题讨论】:

    标签: sql sql-server


    【解决方案1】:

    你可以在没有光标的情况下做到这一点。首先你需要把你的数据格式如下:

    Item |  QtyOnHand  | Initial date
    Item | -QtyOrdered | ShipDate 
    

    然后你需要按项目和日期求和。接下来,您计算数量的运行总和。最后选择数量为负的最小日期。这是完整的查询:

    with cte1 as
    (
      -- assuming QtyOnHand is the same in all Inventory rows
      select Item, min(QtyOnHand) as QtyOnHand, min(ShipDate) as ShipDate 
      from Inventory
      group by Item
    
      union all
    
      select Item, -QtyOrdered as QtyOnHand, ShipDate 
      from Inventory
    )
    , cte2 as
    (
      -- only one row per item and date
      select Item, SUM(QtyOnHand) as QtyOnHand, ShipDate
      from cte1
      group by Item, ShipDate
    )
    , cte3 as
    (
      select 
        Item,
        SUM(QtyOnHand) OVER(partition by item order by ShipDate) as QtyOnHand,
        ShipDate
      from
        cte2
    )
    select Item, min(ShipDate) as ShipDate
    from cte3
    where QtyOnHand < 0
    group by Item
    

    SUM() OVER() 需要 SQL Server 2012 但当然还有其他方法可以计算运行总和。检查fiddle

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-16
      • 1970-01-01
      • 2020-12-13
      • 2011-10-11
      • 1970-01-01
      • 2020-08-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多