Berechnung für Zeitraum Start bis Zeitraum Ende

Mr. Robot

Fleissiger Benutzer
Beiträge
88
Hallo zusammen,

ich habe folgende Ausgangssituation:

Tabelle1
NAMEZEITRAUM_VONZEITRAUM_BIS
Hans
01.07.2020​
31.12.2020​
Peter
31.01.2020​
31.12.2020​
Max
01.01.2021​
30.11.2021​
Moritz
01.01.2021​
01.02.2021​
Claudia
01.01.2021​
30.11.2021​

Tabelle2
DATUMWERT
01.01.2021​
6.461​
02.01.2021​
7.133​
03.01.2021​
6.738​
04.01.2021​
6.371​
05.01.2021​
6.384​
06.01.2021​
6.390​
07.01.2021​
6.397​
08.01.2021​
6.402​
09.01.2021​
7.192​
10.01.2021​
6.785​
11.01.2021​
6.411​
12.01.2021​
6.418​

… usw. tägliche Werte für das ganze Jahr

Tabelle3
DATUMPREIS
01.01.2021​
2,50​
01.02.2021​
3,50​
01.03.2021​
4,50​
01.04.2021​
1,60​
01.05.2021​
5,50​
01.06.2021​
2,70​
01.07.2021​
2,80​
01.08.2021​
3,00​

… usw. monatliche Werte für das ganze Jahr

Als erstes wollte ich die Tabelle 1 um eine weitere Spalte ergänzen, so dass je ZEITRAUM_VON bis ZEITRAUM_BIS die Werte aus Tabelle 2 summiert und ausgegeben werden. Das habe ich wie folgt lösen können:

SELECT

NAME,
ZEITRAUM_VON,
ZEITRAUM_BIS,

,(SELECT SUM(Tab2.WERT)
FROM Tabelle2 Tab2
WHERE Tab2.DATUM >= Tab1.ZEITRAUM_VON and
Tab2.DATUM <= Tab1.ZEITRAUM_BIS
) AS SUMME

FROM Tabelle1 Tab1

Jetzt suche ich folgende Abfrage:

Weiterhin Betrachtung ZEITRAUM_VON bis ZEITRAUM_BIS aus Tabelle 1. Aus Tabelle 2 möchte ich jetzt nur die Summe für den ersten Monat aus dem Zeitraum bilden und mit dem PREIS aus der Tabelle 3 für den jeweiligen Monat multiplizieren. Dann der nächste Monat usw. Und am Ende alles aufsummieren.

Beispiel Moritz:
Summe Wert aus Tabelle 2 für Januar * 2,5 + Summe Wert aus Tabelle 2 für Februar * 3,5

Lässt sich das auch so einfach in eine Unterabfrage integrieren oder muss man hier anders herangehen?

Vielen Dank.

Viele Grüße
 
Werbung:
Erstmal ist deine Lösung nicht optimal, besser wäre schon mal:
Code:
SELECT    t1.name,
    t1.zeitraum_von,
    t1.zeitraum_bis,
    sum(t2.wert) AS summe_wert
FROM    Tabelle1 t1
LEFT JOIN Tabelle2 t2
ON    t2.datum BETWEEN t1.zeitraum_von AND t1.zeitraum_bis
GROUP BY t1.name,
    t1.zeitraum_von,
    t1.zeitraum_bis
Daraus lässt sich dann aber noch viel mehr machen, wenn ich richtig sehe suchst du etwa:
Code:
SELECT    t1.name,
    t1.zeitraum_von,
    t1.zeitraum_bis,
    datepart(year,t2.datum),
    datepart(month,t2.datum),
    sum(t2.wert * t3.preis) AS summe_preis_pro_monat
FROM    Tabelle1 t1
LEFT JOIN Tabelle2 t2
ON    t2.datum BETWEEN t1.zeitraum_von AND t1.zeitraum_bis
LEFT JOIN Tabelle3 t3
ON    datepart(year,t2.datum) = datepart(year,t3.datum)
AND    datepart(month,t2.datum) = datepart(month,t3.datum)
GROUP BY t1.name,
    t1.zeitraum_von,
    t1.zeitraum_bis,
    datepart(year,t2.datum),
    datepart(month,t2.datum)
Die Lösung hat aber ein paar Fallstricke, z.B. wenn du in Tabelle3 mal mehr als einen Datensatz pro Jahr und Monat hast knallt es schnell. Auch ist es nicht ganz trivial beide Abfragen zu kombinieren, aber auch das ist machbar.
 
Zurück
Oben