2017-11-22 7 views
0

私は毎回テーブルを落として再作成するコードを持っています。そしてカーソルを使って、実行中の総在庫量を計算します。カーソルのコードは、(テーブル名が隠さ)以下の通りです:実行中の合計を計算するには、このカーソルを書き換えることができますか?

DECLARE @Cust_Name nvarchar(250), 
       @Cust_Postcode nvarchar(50), 
       @MatchCode_Product nvarchar(50), 
       [email protected] 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 

コードが正常に動作しますが、それとの私の問題は、それが実行に年齢を取ることであり、それを実行するのにかかる時間として時間の経過とともに増加しています私は日々のデータをソーステーブルにロードしています。

誰かがこれをより効率的に書き直してくれますか?その周りを見てから、窓関数が多く役立つように見えますが、私はそれらに精通していません。

「証券」は実行中の合計である列は、「StartStockは」「順序」初期量とある

は、我々はそれがに来るときに追加するために必要なものである

+0

? –

+0

再帰的CTEは、カーソルの最良の代替手段です。https://stackoverflow.com/questions/6824669/why-is-cte-better-than-cursor-derived-table-subqueries-temp-table-etc –

+0

@RigertaDemiri SQL Server 2012 – GraveyardWorker21005

答えて

1

前の無限の行を持つ例:。

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

結果、使用しているSQL Serverのバージョン

enter image description here

+0

年内に合計を実行する場合は、年(dato)ごとにパーティションを追加するだけです。しかし、あなたのデータがどのように見えるかわからないときに、あなたが何を正確に求めているかを伝えるのは難しいです。 – plaidDK

+0

うわーは私がやっていたよりもはるかに簡単です。ありがたいことに感謝します。私はそれにその機能を使って行きます。 – GraveyardWorker21005

関連する問題