Ας το παραδεχτούμε, μία κατηγορία ανθρώπων έχει μία ερωτική σχέση με τα προοδευτικά υπόλοιπα ή running totals. Δεν υπάρχει εκτύπωση που να μην θέλουν και το σχετικό προοδευτικό υπόλοιπο και μερικές φορές παραπάνω από ένα! Στο ακόλουθο παράδειγμα θα δούμε έναν τρόπο με τον οποίο μπορούμε να τα υπολογίσουμε στον SQL Server με πολύ μικρό κόστος στις επιδόσεις του συστήματος.
Αρχικά δημιουργούμε έναν πίνακα, έστω ο πίνακας Transactions με χρηματικές κινήσεις ανά πελάτη, ο οποίος δημιουργείται με το ακόλουθο query:
CREATE TABLE [dbo].[Transactions] (
[Trn_ID] [int] IDENTITY (1, 1) NOT NULL ,
[Trn_CustID] [int] NOT NULL ,
[Trn_Date] [datetime] NOT NULL ,
[Trn_Amount] [decimal](18, 2) NOT NULL ) ON [PRIMARY]
GO
ALTER TABLE [dbo].[Transactions] WITH NOCHECK ADD CONSTRAINT [PK_Transactions] PRIMARY KEY CLUSTERED (
[Trn_ID] ) ON [PRIMARY]
GO
ALTER TABLE [dbo].[Transactions] ADD
CONSTRAINT [DF_Transactions_Trn_CustID] DEFAULT (10) FOR [Trn_CustID],
CONSTRAINT [DF_Transactions_Trn_Date] DEFAULT (getdate()) FOR [Trn_Date],
CONSTRAINT [DF_Transactions_Trn_Amount] DEFAULT (0) FOR [Trn_Amount]
GO
Προσθέτουμε κάποιες εγγραφές στον πίνακα όπου για χάρη του παραδείγματος θεωρούμε ότι όλες αφορούν έναν πελάτη, αυτόν με Trn_CustID = 10. Στη συνέχεια στον query analyzer εκτελούμε τον παρακάτω κώδικα:
DECLARE @RunningTotal decimal(18, 2)
DECLARE @Temp TABLE(
Trn_Date datetime,
Trn_Amount decimal(18, 2),
Trn_RunningTotal decimal(18, 2))
SET NOCOUNT ON
INSERT INTO @Temp
SELECT
Trn_Date,
Trn_Amount,
0
FROM Transactions
ORDER BY Trn_ID
SET @RunningTotal = 0
UPDATE @Temp
SET @RunningTotal = Trn_RunningTotal = Trn_Amount + @RunningTotal
SELECT * FROM @Temp
Στο τελικό SELECT statement, το πεδίο Trn_RunningTotal περιέχει την τιμή του τρέχοντος υπολοίπου που ήταν και το αρχικό ζητούμενο. Με την τεχνική αυτή μπορούμε επίσης να υπολογίσουμε και άλλα μεγέθη όπως πχ το τρέχον υπόλοιπο ενός είδους σε μία αποθήκη και πως αυτό μεταβάλλετε με τις σχετικές εισαγωγές - εξαγωγές.
Κοντογιάννης Γεώργιος
MCP, MCSD