2017-01-10 2 views
1

Ich versuche, die Balance aus diesen DatenSQL Server - addieren oder subtrahieren von früheren Wert

Date   Logged  Closed 
-------------- ----------- ----------- 
1-Jan-2016  0   0 
2-Jan-2016  8   7 
3-Jan-2016  8   8 
4-Jan-2016  25   11 
5-Jan-2016  20   16 
6-Jan-2016  14   13 
7-Jan-2016  10   12 
8-Jan-2016  9   7 
9-Jan-2016  12   12 
10-Jan-2016 3   4 

Die erwartete Ausgabe ist

Date   Logged  Closed  Balance 
-------------- ----------- ----------- ---------- 
1-Jan-2016  0   0   0 
2-Jan-2016  8   7   1 
3-Jan-2016  8   8   1 
4-Jan-2016  25   11   15 
5-Jan-2016  20   16   19 
6-Jan-2016  14   13   20 
7-Jan-2016  10   12   18 
8-Jan-2016  9   7   20 
9-Jan-2016  12   12   20 
10-Jan-2016 3   4   27 

Die Formel BALANCE ist zu erhalten = PREVIOUSBALANCE + LOGGED - GESCHLOSSEN.

Beispiel Formel:

Jan 5 Balance (15) = 1(prevBalance) + 25(currentLogged) - 11(currentClosed) 

ich diese Formel versucht habe, aber nicht irgendwo in der Nähe zu dem gewünschten Ergebnis zu bekommen.

WITH CTE AS (
SELECT 
rownum = ROW_NUMBER() OVER (ORDER BY Date), 
Date, Logged, Closed 
FROM Table 
) 

SELECT 
(prev.Logged - prev.Closed)+ (a.Logged-a.Closed) as [Balance] 
FROM CTE 

LEFT JOIN CTE prev ON prev.rownum = CTE.rownum - 1 

Andere Referenzen verwendet

SQL Server - Calculate current row value using previous row value

http://blog.sqlauthority.com/2013/09/22/sql-server-how-to-access-the-previous-row-and-next-row-value-in-select-statement/

+0

, welche Version von SQL-Server verwenden Sie? –

+0

Derzeit mit 2012 Express. Aber ich hoffe, dass die Abfrage flexibel wäre, um auch an 2008 zu arbeiten. – Mitchi

Antwort

0

Das Problem Ihrer Antwort ist der Balanced der vorherigen Zeile nicht verfügbar ist, wenn Sie (SQL-Server ‚s All-at-once-Prinzip) zu berechnen. Ihre Frage enthält eine verborgene Anforderung, die Summe aller vorherigen Zeilen nach Datum zu berechnen.

die Sie interessieren (nur für SQL Server 2012 angewendet und darüber hinaus)

SELECT 
    [Date], Logged, Closed, 
    SUM(Logged) OVER (ORDER BY [Date] ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) 
    - SUM (Closed) OVER (ORDER BY [Date] ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS Balance 
FROM 
    <<Table>> 

Für Vorversion:

SELECT 
    t.[Date], t.Logged, t.Closed, sub.L - sub.C AS Balanced 
FROM 
    <<Table>> t 
    CROSS APPLY (SELECT SUM(Logged) AS L, SUM(Closed) AS c FROM <<Table>> WHERE [Date] <= t.[Date]) AS sub 
+1

Ich habe die erste Abfrage versucht und es hat wie ein Charme funktioniert! Vielen Dank! – Mitchi

+0

@Mitchi Sie müssen die Summe nicht separat berechnen. Siehe meine Antwort. – GurV

2

Sie können diese sum Fensterfunktion tun verwenden.

Try this:

select 
    t.*, 
    sum(logged - closed) over (order by date) balance 
from your_table t; 
Verwandte Themen