Berechnung Kosten anderes Bezugsdatum

Tscheche

Benutzer
Beiträge
6
Hallo Wertes Forum,
als neues Mitglied hier möchte ich gerne einmal mein Glück versuchen ob ich hier Hilfe für mein Problem bekomme. Hoffe hier sind einige Tüftler, die mit weiterhelfen können.

Folgendes Problem:

Für eine Liquiditätsanalyse will ich nach Kalenderwoche gefiltert die Summe der Kosten einzelner Geschäftspartner anzeigen lassen.
Soweit so gut, das bekomme ich mit meinem "besseren" Einsteiger Wissen auch hin. Wenn jemand die Abfrage sehen möchte kann ich diese gerne mal aufbereitet teilen.

Mein aktuelles Problem ist aber, dass ich 2 Arten von Verträge habe, bei denen am Anfang des Monats eine Abschlagszahlung in Höhe von 80% des Vormonat-Betrags fällig wird.

Liquidität Monat März:
Bsp.: Abschlag im März ist 0,8*Kosten Februar

So. unten habe ich meine SQL Abfrage einmal aufgeführt, wie ich den Vormonat anzeigen lasse, aber ich benötige noch den Denkanstoß, wie ich dabei auch den Vormonatsbetrag berechnen kann.

Aktuell
Code:
Select Geschäftspartner,
sum (kosten),
Lieferende,
add_month(Lieferende,-1)

From Tabelle xY, Tabelle YY

where TabellexY.NR = TabelleYY.Nr
and Lieferanfang => '01.01.2017'
and Lieferende <= '01.01.2018'
and kosten !=0

So, jetzt zeigt er mir das an was ich möchte, aber berechnet noch die Kosten natürlich für den aktuellen Monat der zu dem Liefermonat gehört und nicht nach der Bedingung, die ich brauche.

Achja, ich lasse mir das ganze Jahr anzeigen, aber die Kosten sind in Monatsscheiben in der Datenbank angelegt, sodass er mir eben den aktuellen Monat auflistet. Nur muss es im Falle meiner Abschläge für die Zahlungsläufe März mir den Februar berechnen.

Das ganze ist dann am Ende auch Teil einer großen Abfrage.

Vielen Dank an alle die Helfen :)
 
Werbung:
sorry, Bahnhof. Dein SQL cheint pseudocode zu sein - er ist syntaktisch falsch. Vielleicht kommst Du besser, Du entwirftst eine kleine Beispieltabelle mit Daten und was bei rauskommen soll, damit man es nachvollziehen kann.
 
Okay, habe schon befürchtet, dass man meine Frage nicht nachvollziehen kann.
Wie kann ich denn eine Tabelle am besten einfügen?
Code:
Datum    Kosten    Zahlungsziel
                    150.000,00 €     15.01.2017
31.01.2017     150.000,00 €     15.02.2017
28.02.2017     200.000,00 €     15.03.2017
31.03.2017     150.000,00 €     15.04.2017
30.04.2017     100.000,00 €     15.05.2017
31.05.2017     200.000,00 €     15.06.2017
30.06.2017     100.000,00 €     15.07.2017
31.07.2017     200.000,00 €     15.08.2017
31.08.2017     100.000,00 €     15.09.2017
30.09.2017     200.000,00 €     15.10.2017
31.10.2017     100.000,00 €     15.11.2017
30.11.2017     100.000,00 €     15.12.2017
31.12.2017     150.000,00 €     15.01.2017

So würde das aussehen.

Das Datum der ersten Spalte gibt das Datum des Liefermonates (also den letzten Tag) Spalte 2 enthält die IST Kosten des jeweiligen Monates und Spalte 3 das Zahlungsziel für den Liefermonat.

Nun habe ich das Problem, dass ich aber eine Abschlagszahlung vornehmen muss für den laufenden Monat auf Basis der IST Daten des Vormonates.

D.h.: Zum Zahlungsziel 15.03.2017 wäre folgendes fällig: 0,8* Kosten 28.02.2017 + Kosten 28.02.2017 - Abschlag 15.02.2017.

Also zusätzlich zum Abschlag ist dann noch die Differenz von IST und Abschlag aus dem Vormonat fällig.

Meine "Pseudo" SQL Abfrage zeigt mir quasi aus der Datenbank die Ergebnisse an, die ich oben in der Tabelle habe.

Code:
SELECT t1.Lieferende Datum, t1.Kosten,t1.Zahlungsziel

FROM Beispiel_Tabelle t1

where t1.Lieferbeginn >= '01.01.2017'
and   t1.Lieferende <= '31.12.2017'
and  t1.Kosten=! 0


Ich bräuchte nun eine Spalte, die mir die Formel oben berechnet, aber ich komme von selbst absolut nicht drauf, wie ich das ausrechnen könnte.
Die Spalte soll dann von mir aus soaws wie Summe heißen. Ist ja nur ein Beispiel

Ich hoffe ich konnte das nun besser erklären :(
 
Das ist ein klassischer Fall für lag():

Code:
test=*# select * from tscheche ;
  datum  | kosten | zahlungsziel
------------+--------+--------------
  |  150 | 2017-01-15
 2017-01-31 |  150 | 2017-02-15
 2017-02-28 |  200 | 2017-03-15
 2017-03-31 |  150 | 2017-04-15
 2017-04-30 |  100 | 2017-05-15
(5 Zeilen)

test=*# select *, kosten * 0.8  + kosten - lag(kosten) over (order by datum) * 0.8 from tscheche order by datum;
  datum  | kosten | zahlungsziel | ?column?
------------+--------+--------------+----------
 2017-01-31 |  150 | 2017-02-15  |   
 2017-02-28 |  200 | 2017-03-15  |  240.0
 2017-03-31 |  150 | 2017-04-15  |  110.0
 2017-04-30 |  100 | 2017-05-15  |  60.0
  |  150 | 2017-01-15  |  190.0
(5 Zeilen)

test=*#

Bin mir nicht ganz sicher, ob ich Deine Formel richtig verstanden und realisiert habe, aber ich denke, du siehst den Weg ...
 
Hi akretschmer,
vielen dank für die schnelle Hilfe.
Das war genau die Funktion die ich gesucht habe und noch nicht kannte.

Habe es ausprobiert und bisher scheint alles super zu funktionieren.
Habe es sogar in meine große endgültige Abfrage schon eingebaut und auch da scheint es auch zu klappen.

Eine Frage habe ich noch.
bei lag().. over (order by Datum) Sortiert er hier unabhängig von der eigentlichen Sortierung? Also dass man extra für die Formel anders sortieren kann?..
LG
 
bei lag().. over (order by Datum) Sortiert er hier unabhängig von der eigentlichen Sortierung?

Ja. Wenn ich sage, die Zeile vorher (also lag(), es gibt da noch mehr Möglichkeiten), dann muß sich das ja auf eine Sortierung beziehen. Diese kann unabhängig von der Sortierung der Ausgabe sein. Du kannst auch mehrfache lag() - Aufrufe haben, mit je eigenständiger Sortierung.
 
Werbung:
Okay, super, vielen Dank.

Habe die SQL Abfrag auf Grund der Lag Funktion jetzt sogar nochmal komplett überarbeiten können, so dass Sie nun viel freundlicher aussieht.
Vielen Lieben Dank.
 
Zurück
Oben