2

Je suis en train de faire les totaux en cours d'exécution dans mon point de vue dans SQL Server 2008totaux en cours dans une vue SQL

Voici mes tableaux

BankAccounts 
------------ 
AccountID (KEY) 
Name 
Created 

Transactions 
------------ 
TransactionID (KEY) 
Description 
Credit 
Debit 
TransDate 
Created 
AccountID

Voici ma requête à ce jour ..

 
SELECT t.Created, t.Description, t.Credit, t.Debit, t.TransDate, t.TransactionID, ba.AccountID, 
     (isnull(t.Credit,0)-isnull(t.Debit,0))+COALESCE((SELECT SUM(isnull(Credit,0)) - SUM(isnull(Debit,0)) 
           FROM Transactions b 
           WHERE b.TransDate < t.TransDate 
           and b.AccountID = t.AccountID),0) 
           AS RunningTotal 
FROM Transactions t 
INNER JOIN dbo.BankAccounts ba ON t.AccountID = ba.AccountID 

Ce que je veux est ..

 
TransDate    Credit     Debit     RunningTotal 
----------------------- ---------------------- ---------------------- --------------------- 
2011-10-08 20:14:00  NULL     12      49.25 
2011-10-08 20:14:00  2.11     NULL     63.36 
2011-10-07 20:14:00  42.25     NULL     61.25 
2011-10-06 20:14:00  NULL     12.25     19 
2011-10-05 20:14:00  31.25     NULL     31.25 

Ce qu'il devrait ressembler ...

 
TransDate    Credit     Debit     Running Total 
----------------------- ---------------------- ---------------------- --------------------- 
2011-10-08 00:31:32.957 NULL     12      51.36 
2011-10-08 00:31:32.957 2.11     NULL     63.36 
2011-10-07 00:31:32.957 42.25     NULL     61.25 
2011-10-06 00:31:32.957 NULL     12.25     19 
2011-10-05 00:31:32.960 31.25     NULL     31.25 

Je suis vraiment proche .. semble juste quand il y a 2 transactions pour le même jour, il ne calcule pas correctement .. toutes les idées?

Répondre

6

j'ai utilisé ROW_NUMBER et un CTE puisque vous êtes en 2008

WITH transactionTotal AS 
(
    SELECT t.Created, t.Description, t.Credit, t.Debit, t.TransDate, t.TransactionID, a.AccountID 
     , ROW_NUMBER() OVER (ORDER BY TransDate ASC) AS RowNumber 
     , (ISNULL(t.Credit, 0) - ISNULL(t.Debit, 0)) AS TransactionTotal 
    FROM dbo.Transactions AS t 
    INNER JOIN dbo.BankAccounts AS a ON t.AccountID = a.AccountID 
) 
SELECT t.Created, t.Description, t.Credit, t.Debit, t.TransDate, t.TransactionID, t.AccountID 
    , (SELECT SUM(tt.TransactionTotal) 
     FROM transactionTotal AS tt 
     WHERE tt.RowNumber <= t.RowNumber) AS RunningTotal 
FROM transactionTotal AS t 
LEFT JOIN transactionTotal AS tt ON t.RowNumber = tt.RowNumber + 1 
ORDER BY t.TransDate DESC 
+0

TRÈS gentil !! Été essayer d'obtenir cela pendant des jours, juste eu à faire face à des totaux faux, jusqu'à présent ... mettre ceci dans une vue et cela fonctionne GREAT – jaekie

1
SELECT t.Created, t.Description, t.Credit, t.Debit, t.TransDate, t.TransactionID, ba.AccountID, 
     coalesce((select sum(ISNULL(Credit,0) - ISNULL(Debit, 0)) 
       from Transactions 
       where TransactionID <= t.TransactionID and 
         AccountID = ba.AccountID and 
         convert(date, TransDate) = convert(date, t.TransDate)),0) 
     AS [Running Total] 

FROM Transactions t INNER JOIN 
     dbo.BankAccounts ba ON t.AccountID = ba.AccountID 
+0

ne semble pas fonctionner, et manquait un (après coalesce ... je vais éditer le poste pour montrer ce que je reçois – jaekie

+0

Je crois que le problème pourrait être sur la façon dont vous obtenez le petit jour de la date, je ' ll va mettre à jour ma réponse –

+1

ok, j'ai mis à jour, voir qu'un autre changement est j'ai remplacé 'Running Total' sur [Running Total], sur mes tests 'Running Total' le nom ne fonctionne pas –

0

si c'est Oracle, alors il y a des fonctions de fenêtre. vous pouvez utiliser LEAD et/ou LAG pour effectuer des calculs sur la ligne en cours par rapport aux lignes antérieures ou à venir (en fonction de l'ordre de tri)

+0

son SQL Server, je vais mettre à jour la question – jaekie

1

- J'utiliserais la colonne d'identité existante pour être sûr à 100% que je traite la transaction correcte.

SELECT t.Created, t.Description, t.Credit, t.Debit, t.TransDate, t.TransactionID, ba.AccountID, 
     (isnull(t.Credit,0)-isnull(t.Debit,0))+COALESCE((SELECT SUM(isnull(Credit,0)) - SUM(isnull(Debit,0)) 
           FROM Transactions b 
           WHERE b.TransactionID < t.TransactionID 
           and b.AccountID = t.AccountID),0) 
           AS RunningTotal 
FROM Transactions t 
INNER JOIN dbo.BankAccounts ba ON t.AccountID = ba.AccountID 

--also si vous changez le « Moins » à « Moins ou égal à », alors vous ne devez pas ajouter l'élément en cours:

SELECT t.Created, t.Description, t.Credit, t.Debit, t.TransDate, t.TransactionID, ba.AccountID, 
COALESCE((SELECT SUM(isnull(Credit,0)) - SUM(isnull(Debit,0)) 
           FROM Transactions b 
           WHERE b.TransactionID <= t.TransactionID 
           and b.AccountID = t.AccountID),0) 
           AS RunningTotal 
FROM Transactions t 
INNER JOIN dbo.BankAccounts ba ON t.AccountID = ba.AccountID 

totaux devraient être: (en supposant) Solde de départ: 49,25

TransDate    Credit   Debit   RunningTotal  
----------------------- ----------------- -------------- ----------------- 
2011-10-08 20:14:00  NULL    12    37.25 
2011-10-08 20:14:00  2.11    NULL   39.36    
2011-10-07 20:14:00  42.25    NULL   81.61 
2011-10-06 20:14:00  NULL    12.25   69.36 
2011-10-05 20:14:00  31.25    NULL   100.61 
Questions connexes