J'utilise le serveur sql 2012..je dois obtenir l'équilibre courant sur chaque ligne..maintenant j'utilise la requête ci-dessous

 CREATE TABLE #Test(ID INT,TransDate datetime,Credit MONEY,[Debit] money)
        INSERT INTO #Test
        SELECT 1,'01/01/2017',10000,NULL UNION    
        SELECT 1,'01/05/2017',40000,NULL UNION
        SELECT 1,'01/05/2017',200,NULL UNION
        SELECT 1,'01/05/2017',200,NULL UNION   
        SELECT 1,'01/09/2017',NULL,45000  UNION
        SELECT 2,'01/05/2017',1000,NULL UNION
        SELECT 2,'01/06/2017',1000,NULL 


        SELECT t1.ID,convert(varchar,t2.TransDate,103) 'date', 
        t2.Credit, 
        t2.Debit, 
        SUM(COALESCE(t1.credit, 0) - COALESCE(t1.debit, 0)) AS Balance
        FROM #Test t1 
        INNER JOIN #Test t2
            ON t1.TransDate <= t2.TransDate

        GROUP BY t1.ID,t2.TransDate  , t2.Credit, t2.Debit

Production:

1   01/01/2017  10000.00    NULL    10000.00
1   05/01/2017  200.00      NULL    50200.00
1   05/01/2017  1000.00     NULL    50200.00
1   05/01/2017  40000.00    NULL    50200.00
1   06/01/2017  1000.00     NULL    50200.00
1   09/01/2017  NULL      45000.00   5200.00
2   05/01/2017  200.00      NULL     1000.00
2   05/01/2017  1000.00     NULL     1000.00
2   05/01/2017  40000.00    NULL     1000.00
2   06/01/2017  1000.00      NULL    2000.00
2   09/01/2017  NULL      45000.00   2000.00

Exiger une sortie:

Production:

1   01/01/2017  10000.00    NULL    10000.00
1   05/01/2017  200.00      NULL    10200.00
1   05/01/2017  1000.00     NULL    11200.00
1   05/01/2017  40000.00    NULL    50200.00
1   06/01/2017  1000.00     NULL    51200.00
1   09/01/2017  NULL      45000.00   5200.00
2   05/01/2017  200.00      NULL      200.00
2   05/01/2017  1000.00     NULL     1200.00
2   05/01/2017  40000.00    NULL     41200.00
2   06/01/2017  1000.00      NULL    42200.00

Mais si plusieurs entrées pour la même requête tran day ne fonctionnent pas (voir le résultat des 2e, 3e et 4e rangées) .. cela ne devrait pas être le même .. S'il vous plaît quelqu'un m'aider à obtenir le bon résultat?

2
Ajt 17 janv. 2017 à 11:51

2 réponses

Meilleure réponse

Utilisez une fonction de fenêtre . Cela fonctionnera si la colonne de date contient datetime ...

select id, 
       TransDate, 
       credit, 
       debit, 
       sum(coalesce(credit,0)-coalesce(debit,0)) 
           over (partition by id order by TransDate) as RunningBalance
from #Test

Si la colonne de date est uniquement la date, utilisez:

with t1 as
(
select id, 
       TransDate, 
       credit, 
       debit, 
       row_number() over(partition by id, Transdate order by credit) as t_ord
from #Test
)
select id, 
       TransDate, 
       credit, 
       debit,
       sum(coalesce(credit,0)-coalesce(debit,0)) 
           over (partition by id order by TransDate, t_ord) as RunningBalance
from t1
1
JohnHC 17 janv. 2017 à 09:26

Obtenez d'abord la date avec la colonne requise et le groupe par date:

select A.TransDate, SUM(COALESCE(credit, 0)) as credit, SUM(COALESCE(debit, 0)) as debit, SUM(COALESCE(credit, 0) - COALESCE(debit, 0)) AS Balance from
(
SELECT convert(varchar,t2.TransDate, 103) as TransDate,  t2.Credit,     t2.Debit  
FROM Test t1 
INNER JOIN Test t2
    ON t1.TransDate <= t2.TransDate
) as  A group by A.TransDate

================= Ou ===============

Avec table de température:

select A.TransDate, SUM(COALESCE(credit, 0)) as credit, SUM(COALESCE(debit, 0)) as debit, SUM(COALESCE(credit, 0) - COALESCE(debit, 0)) AS Balance from
(
SELECT convert(varchar,t2.TransDate, 103) as TransDate,  t2.Credit,     t2.Debit  
FROM Test #t1 
INNER JOIN #Test t2
    ON t1.TransDate <= t2.TransDate
) as  A group by A.TransDate
1
jainvikram444 17 janv. 2017 à 09:07