Frage zu SQL Abfrage

Dreamer1642

Neuer Benutzer
Beiträge
2
Hallo zusammen,

ich versuche gerade mit SQL eine Abfrage zu schreiben aber stehe gerade auf dem Schlauch und weiß somit nicht wie ich dies umsetzen soll.

Ich hab eine Tabelle gegeben mit Unternehmens_ID, Meldejahr, Typ_ID und Umsatz des Unternehmens. Dabei werden die Werte von jedem Unternehmen jedes Jahr neu abgefragt, es kann dabei aber sein, dass das Unternehmen nicht jedes Jahr einen Umsatz hat oder es kann auch möglich sein, dass bei einem Unternehmen der Umsatz für die gesamte Zeit kein Umsatz existiert.

Tabelle sieht also folgendermaßen aus:

ID Meldejahr Typ_ID Umsatz

1 2022 1 1000
1 2021 2 null
1 2020 1 950

2 2022 2 null
2 2021 2 null

3 2022 2 null
3 2021 2 null
3 2020 1 5000

Ich möchte nun also (markierte Werte) abfragen, wann das neueste Jahr, also max(Meldejahr), ist an dem ein Umsatz angegeben ist und dieses Meldejahr und die Typ_ID verwenden und wenn ein Unternehmen über die Zeit gar keine Umsatz hat, das neueste Meldejahr und die dazugehörige Typ ID verwenden.

Wie setze ich dies am einfachsten um?
 
Werbung:
in PostgreSQL

Code:
postgres=# select * from dreamer1642 ;
 id | jahr | typ | umsatz 
----+------+-----+--------
  1 | 2022 |   1 |   1000
  1 | 2021 |   2 |       
  1 | 2020 |   1 |    950
  2 | 2022 |   2 |       
  2 | 2021 |   2 |       
  3 | 2022 |   2 |       
  3 | 2021 |   2 |       
  3 | 2020 |   1 |   5000
(8 rows)

postgres=# with foo as (select id, max(jahr) from dreamer1642 where umsatz is not null group by id union select id, max(jahr) from dreamer1642 where umsatz is null and id not in (select distinct id from dreamer1642 where umsatz is not null) group by id) select d.* from dreamer1642 d right join foo f on ((d.id=f.id) and (f.max=d.jahr));
 id | jahr | typ | umsatz 
----+------+-----+--------
  1 | 2022 |   1 |   1000
  2 | 2022 |   2 |       
  3 | 2020 |   1 |   5000
(3 rows)

postgres=#

Als Schnellschuß, geht bestimmt noch einfacher ...
 
Werbung:
Code:
WITH t AS (
SELECT    ROW_NUMBER() OVER (PARTITION BY UnternehmenID ORDER BY Meldejahr DESC) AS zeile,
        *
FROM    tabelle
WHERE    Umsatz IS NOT NULL
    )
SELECT    t.UnternehmenID,
        t.Meldejahr,
        t.TypID,
        t.Umsatz
FROM    t
WHERE    t.zeile = 1
UNION ALL
SELECT    t1.UnternehmenID,
        t1.Meldejahr,
        t1.TypID,
        t1.Umsatz
FROM    tabelle t1
WHERE    t1.Umsatz IS NULL
AND NOT EXISTS (    SELECT    1
                    FROM    tabelle t2
                    WHERE    t1.UnternehmenID = t2.UnternehmenID
                    AND    (    t2.Umsatz IS NOT NULL
                    OR        t1.Meldejahr < t2.Meldejahr ) );
Der erste Teil (bis zum UNION) müsste alle Einträge mit Umsatz liefern und davon den neuesten und der zweite Teil alles was keinen Umsatz hat und davon das neuste Meldejahr.
 
Zurück
Oben