2017-08-21 1 views
-1

Ich habe 2 Tabellen. Einer nur mit allen Perioden. Zweitens mit Konto, Betrag und Zeitraum.Füllung laufende Summe über den ganzen Monat, obwohl seine null

Ich möchte eine Ansicht erstellen, die den kumulierten Betrag, Zeitraum und Konto auflistet. Auch wenn ich keinen Fakt für einen Zeitraum in meiner Tabelle habe sollte der Zeitraum aus meiner Sicht mit dem letzten Betrag angezeigt werden.

select distinct 
    account, b.periode, 
    SUM(amount) OVER (PARTITION BY account ORDER BY b.periode RANGE UNBOUNDED PRECEDING) 
from 
    fakten a 
full join 
    perioden b on a.periode = b.periode 
order by b.periode 

es wie folgt aus:

1  1 6 
2  1 4 
1  2 13 
2  2 3 
NULL 3 NULL 
1  4 46 
2  5 48 
NULL 6 NULL 
NULL 7 NULL 
1  8 147 
NULL 9 NULL 
NULL 10 NULL 
NULL 11 NULL 
NULL 12 NULL 

Ich brauche es mag:

1  1 6 
2  1 4 
1  2 13 
2  2 3 
1  3 13 
2  3 3 
1  4 46 
2  4 3 
1  5 46 
2  5 48 
1  6 46 
2  6 46 
and so one... 

Irgendwelche Ideen?

+0

Hallo und willkommen bei SO. Wir brauchen noch ein paar Details, um hier wirklich helfen zu können. Dies ist ein großartiger Ort, um anzufangen. http://spaghettidba.com/2015/04/24/how-to-post-at-sql-question-on-a-public-forum/ –

+0

vielleicht einige Details wie: NULL 3 NULL wird zu: 1 3 13 in der Frage wäre hilfreich für die Leute – sniperd

+0

nur bis zu Punkt 12 zu beantworten. –

Antwort

0

full join ist nicht der richtige Ansatz. Generieren Sie stattdessen die gewünschten Zeilen mit einem cross join. Verwenden Sie dann left join und group by, um die Berechnung durchzuführen.

select a.account, p.periode, 
     SUM(f.amount) OVER (PARTITION BY a.account ORDER BY p.periode) 
from (select distinct account from fakten) a cross join -- you probably have an account table, use it 
    perioden p 
    on a.periode = p.periode left join 
    fakten f 
    on f.account = a.account and f.periode = p.periode 
group by a.account, p.periode 
order by a.account, p.periode;