Verschachtelte SQL Abfrage mit max und group by

nixfix

Benutzer
Beiträge
10
Werte Forumsmitglieder,

nachdem ich neu hier bin, sag ich mal ein schönes Hallo aus Österreich. Ich beschäftige mich jetzt seit ein paar Monaten mit sql in Verbindung mit SAP und Excel.
Bis jetzt hab ich ja alles so hinbekommen wie ich es wollte nur jetzt bin ich an einem Punkt wo ich mal nicht mehr weiter weiß.

Ich möchte gerne ein Abfrage machen mit der ich das höchste Datum in einer Gruppierung selektieren kann.

So sieht die Tabelle aus:
beleg | datum
20111 | 31.03.2018
20111 | 26.03.2018
20111 | 25.03.2018
20111 | 24.03.2018
20112 | 28.03.2018
20112 | 26.03.2018
20112 | 25.04.2018
20112 | 05.04.2018

Wenn ich mal nur das maximum Abfrage und gruppiere kein Problem

select beleg, max(datum) from table where ..... group by salesorder

20111 | 31.03.2018
20112 | 25.04.2018

Wenn ich aber das höchste Datum aus der Gruppierung abfragen möchte bekomme ich das nicht hin. Wenn ich es so mache wird der Beleg 20112 mitselektiert mit dem höchsten Wert bis zum selektiertem Datum.

select beleg, max(datum) from tablex where datum < '31.03.2018' group by salesorder
20111 | 31.03.2018
20112 | 28.03.2018

Rauskommen sollen aber im Endeffekt nur die Belege bei denen das höchste Datum im Beleg kleiner dem Filterkriterium ist. :-)
20111 | 31.03.2018

Ich hoffe ihr könnt mir helfen. Danke

mfg
nixfix
 
Werbung:
So sieht die Tabelle aus:
beleg | datum
20111 | 31.03.2018
20111 | 26.03.2018
20111 | 25.03.2018
20111 | 24.03.2018
20112 | 28.03.2018
20112 | 26.03.2018
20112 | 25.04.2018
20112 | 05.04.2018

Wenn ich mal nur das maximum Abfrage und gruppiere kein Problem

select beleg, max(datum) from table where ..... group by salesorder

20111 | 31.03.2018
20112 | 25.04.2018

es gibt keine Spalte 'salesorder' in Deiner Tabelle, dafür aber 'beleg', welche im Result weder aggregiert noch gruppiert ist. Damit sollte das gezeigte SQL nicht funktionieren.

Code:
[local]:5432 andreas@test=# create table nixfix(beleg int, datum date);
CREATE TABLE
[local]:5432 andreas@test=#* select beleg, max(datum) from nixfix group by saleorder;
ERROR:  column "saleorder" does not exist
LINE 1: select beleg, max(datum) from nixfix group by saleorder;
  ^
[local]:5432 andreas@test=#! rollback;
ROLLBACK
[local]:5432 andreas@test=# create table nixfix(beleg int, datum date);
CREATE TABLE
[local]:5432 andreas@test=#* select beleg, max(datum) from nixfix;
ERROR:  column "nixfix.beleg" must appear in the GROUP BY clause or be used in an aggregate function
LINE 1: select beleg, max(datum) from nixfix;
  ^
[local]:5432 andreas@test=#!

Bitte zeige nicht *irgendetwas* und erwarte dann, daß wir den Rest passend erraten. Glaskugeln sind sehr teuer hier in Zürich ...
 
Hallo akretschmer,

danke für deine rasche Antwort, sorry, hab mich verschrieben.

Natürlich ist das group by auf den beleg bezogen, also

select beleg, max(datum) from table where datum < '31.03.2018' group by beleg

Ich hoffe die Glaskugel ist noch nicht kaputt und du kannst jetzt nochmal reinschauen ;-). Schöne Grüße in die Schweiz.

Mfg
nixfix
 
select beleg, max(datum) from tablex where datum < '31.03.2018' group by salesorder
20111 | 31.03.2018
20112 | 28.03.2018

Rauskommen sollen aber im Endeffekt nur die Belege bei denen das höchste Datum im Beleg kleiner dem Filterkriterium ist. :)
20111 | 31.03.2018

Gut, wenn wir richtig guppieren nach beleg und so - stimmt aber Dein "Wunschergebniss" nicht mit deinem Select überein, denn der 31.3. ist gleuch dem 31.3., nicht kleiner.
Du suchst offenbar aber folgendes:

Code:
andreas@[local]:5432/test*# select * from nixfix ;
 beleg |  datum   
-------+------------
 20111 | 2018-03-31
 20111 | 2018-03-26
 20111 | 2018-03-25
 20111 | 2018-03-24
 20112 | 2018-03-28
 20112 | 2018-03-26
 20112 | 2018-04-25
 20112 | 2018-04-04
(8 rows)

andreas@[local]:5432/test*# select beleg, max(datum) from nixfix group by beleg having max(datum) <= '2018-03-31';
 beleg |  max   
-------+------------
 20111 | 2018-03-31
(1 row)

andreas@[local]:5432/test*#
 
Hallo Andreas,

super, danke. Hab es gerade getestet und es funktioniert :-). Mit der Funktion having hatte ich bis jetzt noch nichts zu tun.

Ich werde mich auch bemühen, dass ich keine Hoppalas mehr einbaue wenn ich wieder mal eine Frage reinstelle :-)

Also danke nochmal.

mfg

nixfix
 
Werbung:
Das müsste aber auch mit WHERE datum < laufen, das tut es auch bei mir. Ich könnte mir aber vorstellen das der Fehler hier im Format oder in der Konvertierung liegt, welches Format hat die Spalte? Ist das wirklich MSSQL oder vielleicht MySQL?
 
Zurück
Oben