SQLUSA
BI TRIO 2008
FREE TRIAL
CLICK HERE TO ORDER

SQL Server 2008 Best Practices
SQL Server 2005 Best Practices

How to architect running total using cursor?
Contributed by Paul Nielsen, www.sqlserverbible.com

Execute the following T-SQL script in Query Editor to demonstrate the usage of cursor for running total generation.

Generally this solution performs better than applying correlated subquery.

USE AdventureWorks

 

ALTER TABLE Sales.SalesOrderHeader

  ADD CumulativeTotal MONEY NOT NULL

  CONSTRAINT dfSalesOrderHeader DEFAULT(0)

go --

 

 

 

SET NoCount ON

DECLARE

  @SalesOrderID INT,

  @TotalDue MONEY,

  @CumulativeTotal MONEY

 

SET @CumulativeTotal = 0

  -- 1) set up the cursor     

  DECLARE cRun CURSOR FAST_FORWARD

    FOR

      SELECT SalesOrderID, TotalDue

        FROM Sales.SalesOrderHeader

        ORDER BY OrderDate, SalesOrderID

 

   -- 2) open the cursor

  OPEN cRun

 

  FETCH cRun INTO @SalesOrderID, @TotalDue  -- prime the cursor

  WHILE @@Fetch_Status = 0

    BEGIN

      SET @CumulativeTotal = @CumulativeTotal + @TotalDue

      UPDATE Sales.SalesOrderHeader

        SET CumulativeTotal = @CumulativeTotal

        WHERE SalesOrderID = @SalesOrderID   

      FETCH cRun INTO @SalesOrderID, @TotalDue  -- fetch next

    END

  CLOSE cRun

 

  DEALLOCATE cRun

go --

 

 

SELECT SalesOrderID, TotalDue, CumulativeTotal

  FROM Sales.SalesOrderHeader

  ORDER BY OrderDate, SalesOrderID

go --

 

ALTER TABLE Sales.SalesOrderHeader

  DROP CONSTRAINT dfSalesOrderHeader

 

ALTER TABLE Sales.SalesOrderHeader

  DROP COLUMN CumulativeTotal

 

 


The World Leader in SQL Server 2008 Training
The future is just a CLICK away. Your future!
 
SQLUSA.com Home Page

Copyright 2005-2010, SMI Corp. All Rights Reserved.

SQL Server 2008 is a program product of Microsoft Corporation.
SQL Server 2005 is a program product of Microsoft Corporation.
SQL Server 2000 is a program product of Microsoft Corporation.