代码之家  ›  专栏  ›  技术社区  ›  GraveyardWorker21005

我如何重新编写这个游标来计算运行总数?

  •  0
  • GraveyardWorker21005  · 技术社区  · 7 年前

    所以我有一些代码,每次都会删除并重新创建一个表,然后使用光标遍历并计算股票数量的运行总数。光标的代码如下(表名模糊):

    DECLARE @Cust_Name nvarchar(250),
                  @Cust_Postcode nvarchar(50),
                  @MatchCode_Product nvarchar(50),
                  --@Stock int,
                  @DateKey nvarchar(8),
                  @Ordered int
    
    DECLARE StockCursor CURSOR 
      LOCAL STATIC READ_ONLY FORWARD_ONLY
    FOR 
    SELECT
           Cust_Name, Cust_Postcode, MatchCode_Product, DateKey
    FROM
           WRK_TFT_DEPOT_STOCK
    WHERE
        Cust_Name NOT LIKE {redacted}
    
    OPEN StockCursor
    FETCH NEXT FROM StockCursor INTO @Cust_Name, @Cust_Postcode, @MatchCode_Product, @DateKey
    
    WHILE @@FETCH_STATUS = 0
    BEGIN
           UPDATE
                  WRK_TFT_DEPOT_STOCK
           SET
    
                         Ordered = isnull((
                                      SELECT
                                             sum(cast(MO.Quantity as int))
                                      FROM
                                             {redacted }DE
                                             INNER JOIN {redacted} MO
                                             ON DE.Order_No = MO.Order_No
                                      WHERE
                                             DE.Cust_Name = @Cust_Name
                                             AND
                                             DE.Cust_Postcode = @Cust_Postcode
                                             AND
                                             MatchCode_Product = @MatchCode_Product
                                             AND
                                             CAST(Year(DE.Delivery_Date) AS VARCHAR) + RIGHT('0' + CAST(Month(DE.Delivery_Date) AS VARCHAR), 2) + 
                                                RIGHT('0' + CAST(Day(DE.Delivery_Date) AS VARCHAR), 2)  <= @DateKey
                                             AND DE.Cust_Name NOT LIKE {redacted}
                                         ),0)
           WHERE
                  Cust_Name = @Cust_Name
                  AND
                  Cust_Postcode = @Cust_Postcode
                  AND
                  MatchCode_Product = @MatchCode_Product
                  AND
                  DateKey = @DateKey 
    
           FETCH NEXT FROM StockCursor INTO @Cust_Name, @Cust_Postcode, @MatchCode_Product, @DateKey
    END
    
    CLOSE StockCursor
    DEALLOCATE StockCursor
    
    UPDATE
           WRK_TFT_DEPOT_STOCK
    SET
           Stock = StartStock + Ordered
    

    代码运行得很好,但我的问题是,它需要运行很长时间,随着我将每日数据加载到源表中,运行所需的时间会随着时间的推移而增加。

    有谁能帮我更有效地重新写这篇文章吗?从周围看,窗口函数似乎会有很大帮助,但我对它们不熟悉。

    “Stock”列是运行总数,“StartStock”是初始金额,“Ordered”是我们需要添加的内容。

    1 回复  |  直到 7 年前
        1
  •  1
  •   SqlKindaGuy    7 年前

    前一行无限制的示例:

    SELECT TOP 1000 [Dato]
          ,[Department]
          ,[Amount]
          ,runningtotal = SUM(amount) over(order by dato ROWS UNBOUNDED PRECEDING)
      FROM [LegOgSpass].[dbo].[amounts]
    

    后果

    enter image description here