Hilfe bei Grppenfunktion SQL

andre.g.sql

Neuer Benutzer
Beiträge
4
Hallo Zusammen,

ich habe eine recht Simple SQL Aufgabe, komme aber nicht die Lösung:

Folgendes Problem:
Ich habe eine Tabelle mit Preisen und Zeiträumen.

Diese enthält folgende Daten:
Beginn
Ende
Preis

Nun habe ich folgende Werte:
01.01.2020 - 30.06.2020 - 5 €
01.07.2020 - 31.12.2020 - 5 €
01.01.2021 - 30.06.2021 - 2 €
01.07.2021 - 31.12.2021 - 7 €

Das Ziel ist es, die Zeilen mit gleichem Preis in eine Zeile zusammen zu fassen (der Betrag ist bereits ein summierter Wert) und den Zeitraum entsprechend auch zusammenzufassen.

Endergebnis des Select soll also so aussehen:

01.01.2020 - 31.12.2020 - 5 €
01.01.2021 - 30.06.2021 - 2 €
01.07.2021 - 31.12.2021 - 7 €

Wie muss ich das SQL schreiben?

Hier der aktuelle Stand meines SQL´s, welches die aktuelle Ausgabe liefert:

SELECT
beginn,
ende,
sum(preisbetrag) preisbetrag
FROM tabelle1
group by beginn, ende
order by 1

Danke vorab!
 
Werbung:
Du willst nach dem Preis gruppieren, also muss das GROUP BY nur den Preis enthalten. Alle anderen Spalten im Select müssen mit einer Aggregatsfunktion angegeben werden, in Deinem Fall vermutlich MIN(beginn) und MAX(ende)
 
Was soll denn bei folgender Konstellation herauskommen?

01.01.2020 - 30.06.2020 - 5 €
01.07.2020 - 31.12.2020 - 2 €
01.01.2021 - 30.06.2021 - 5 €
01.07.2021 - 31.12.2021 - 7 €

Hier wäre es dann:
1.1.20 - 30.6.21 - 5€
1.7.20 - 31.12.20 - 2 €
1.7.21 - 31.12.21 - 7 €

Wäre das so korrekt? Hier sind Zeiträume ja mit Zwei Preisen (2 und 5 €) belegt (1.7.20 - 31.12.20).
 
Du willst nach dem Preis gruppieren, also muss das GROUP BY nur den Preis enthalten. Alle anderen Spalten im Select müssen mit einer Aggregatsfunktion angegeben werden, in Deinem Fall vermutlich MIN(beginn) und MAX(ende)
Danke für die Antwort. Das habe ich so probiert. Leider lässt das SQL mich nach dem Preis nicht gruppieren, da ich hierauf eine Summenfunktion anwende.

Was soll denn bei folgender Konstellation herauskommen?

01.01.2020 - 30.06.2020 - 5 €
01.07.2020 - 31.12.2020 - 2 €
01.01.2021 - 30.06.2021 - 5 €
01.07.2021 - 31.12.2021 - 7 €

Hier wäre es dann:
1.1.20 - 30.6.21 - 5€
1.7.20 - 31.12.20 - 2 €
1.7.21 - 31.12.21 - 7 €

Wäre das so korrekt? Hier sind Zeiträume ja mit Zwei Preisen (2 und 5 €) belegt (1.7.20 - 31.12.20).

In diesem Fall müssten alle Zeitscheiben nacheinander dargestellt werden. Eine Verbindung der Zeitscheiben sollte nur passieren, wenn der identische Preis anschließend zum nächsten Zeitraum ist.
 
das Zeiten doppelt belegt mit unterschoedlichen Preisen belegt sind macht es in der Tat nicht einfacher. Hier mal eine grobe Idee, solche zusammenfaßbaren Zeiträume zu finden:
(PostgreSQL, Daterange-Datentyp)

Code:
edb=*# select * from andre ;
         von_bis         | wert
-------------------------+------
 [2020-01-01,2020-06-30) |    5
 [2020-07-01,2020-12-31) |    5
 [2020-01-01,2020-06-30) |    2
 [2020-07-01,2020-12-31) |    7
(4 rows)

edb=*# select *, row_number() over (partition by wert order by lower(von_bis)) from andre order by von_bis;
         von_bis         | wert | row_number
-------------------------+------+------------
 [2020-01-01,2020-06-30) |    2 |          1
 [2020-01-01,2020-06-30) |    5 |          1
 [2020-07-01,2020-12-31) |    5 |          2
 [2020-07-01,2020-12-31) |    7 |          1
(4 rows)

edb=*#

Wenn row_number > 1 ist kann das mit der Zeile vorher zusammengefaßt werden.
 
Wenn row_number > 1 ist kann das mit der Zeile vorher zusammengefaßt werden.
Ich glaube, es ist noch aufwändiger. Es sollen ja nur kontinuierliche Zeitscheiben zusammengefasst werden.
Hier ist ein Thread, der etwas ähnliches anhand des Range Types in Postgres zeigt, weiß nicht, ob es den in Oracle gibt:
Combining separate ranges into largest possible contiguous ranges

Das Beispiel von Akretschmer müsste so adaptiert werden, dass nur der lückenlose Wechsel zwischen upper(bis) und lower(von) hochgezählt wird.
 
Werbung:
Vielen Dank an alle für eure Unterstützung. Die Lösung des Problems war eine verschachtelte Gruppierung.

Wie oben bereits erwähnt konnte ich auf den summierten Wert nicht gruppieren. Innerhalb der verschachtelten Gruppierung konnte ich nun eine Gruppierung durchführen, wodurch die Anzeige jetzt wie gewünscht stattfindet.
 
Zurück
Oben