2017-05-25 4 views
0

Ich habe eine Tabelle mit Spalten: ID, Typ (mit 'IN' und 'Out' strings) und Wert (Haltegelddaten)SQL laufend Gesamt Änderung

Ich brauche zu bekommen der Rest jeder Zeile durch Addition und minus von Wert nach der Logik:

  • wenn Type = 'In' dann Wertsumme
  • , wenn Typ = 'Out' dann minus Val ue

Ich habe etwas versucht, aber ich kann nicht feststellen, wo es in oder out ist:

ID Type  Value and in balance like this Balance 
21 In  55        55 
22 IN  78        133 
23 Out  15        118 
24 Out  56        62 
25 In  72        134 
26 Out  5        129 

I-Code wie diese:

SELECT ID , 
     Value , 
     (SELECT SUM(y.Value) 
      FROM  dbo.Reestr y 
      WHERE  y.ID <= x.ID 

     ) AS RunningTotal 
FROM dbo.Reestr x 
ORDER BY 1 ,2 ,3; 

Antwort

5

einfach die kumulative Summe Funktion . Dies ist in SQL Server verfügbar 2012+:

select r.id, r.value, 
     sum(case when r.type = 'in' then value 
       when r.type = 'out' then - value 
      end) over (order by r.id) as balance 
from dbo.Reestr r 
ORDER BY 1, 2, 3; 

Sie können mit einer korrelierten Unterabfrage das gleiche tun, indem Sie den case Ausdruck in der Unterabfrage enthält.

+0

wo group by-Klausel ist. Es wird einen Fehler – Ravi

+1

@Ravi werfen. . . Der Code in der Frage hat keine "Gruppe von". Auch deuten die Daten nicht darauf hin, dass man benötigt wird. Wenn Sie eine Frage zu kumulativen Summen mit Aggregation haben, stellen Sie eine Frage. –

+1

@ Gordon Linoff .... Sie verwenden Aggregatfunktion müssen Sie Gruppieren nach Klausel verwenden, weil Id nicht in Aggregatfunktion ist. Wenn Frage nicht es deshalb hat, erhält er nicht gewünschtes Ergebnis, – Ravi

1

versuchen diese

SELECT ID , 
      Value , 
      (select sum(case when Type = 'IN' then Value 
          when Type='OUT' then (0-value) end) 
      FROM dbo.Reestr y where x.Id>=y.id) AS RunningTotal 
    FROM dbo.Reestr x 
    ORDER BY 1 ,2 ,3;