我如何重写此游标来计算 运行 总数?
How could I re-write this cursor to calculate running total?
所以我有一些代码每次删除并重新创建一个 table,然后使用光标浏览并计算 运行ning 总库存量。游标的代码如下(table 名称模糊):
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
代码工作正常,但我的问题是它需要很长时间才能达到 运行,并且随着我将每日数据加载到来源 tables.
谁能帮我更有效地重写这个?环顾四周,窗口函数似乎会有很大帮助,但我不熟悉它们。
第'Stock'栏是运行宁合计,'StartStock'是初始金额,'Ordered'是我们进来时需要添加的金额。
前面有无限行的示例:
SELECT TOP 1000 [Dato]
,[Department]
,[Amount]
,runningtotal = SUM(amount) over(order by dato ROWS UNBOUNDED PRECEDING)
FROM [LegOgSpass].[dbo].[amounts]
结果
所以我有一些代码每次删除并重新创建一个 table,然后使用光标浏览并计算 运行ning 总库存量。游标的代码如下(table 名称模糊):
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
代码工作正常,但我的问题是它需要很长时间才能达到 运行,并且随着我将每日数据加载到来源 tables.
谁能帮我更有效地重写这个?环顾四周,窗口函数似乎会有很大帮助,但我不熟悉它们。
第'Stock'栏是运行宁合计,'StartStock'是初始金额,'Ordered'是我们进来时需要添加的金额。
前面有无限行的示例:
SELECT TOP 1000 [Dato]
,[Department]
,[Amount]
,runningtotal = SUM(amount) over(order by dato ROWS UNBOUNDED PRECEDING)
FROM [LegOgSpass].[dbo].[amounts]
结果