Limit in Joins...

Zero-G.

Benutzer
Beiträge
14
Hallo
Ich habe folgenden (groben) Tabellenaufbau:

Kunde:
KundenID =BigInt (Primary)
Vorname = Varchar
Nachname = Varchar

Auftrag
Id = BigInt (Primary)
KundenID = BigInt (FK mit Kunde.KundenId)
Auftragstyp = varchar
Datum = date

Auftragdetails
ID = BigInt(Primary)
AuftragId = BigInt (FK mit Auftrag.Id)
ArtikelNr = varchar

So, was ich jetzt gerne hätte, wäre:
Alle Kunden, der Auftragstyp 'TypB" ist, das Datum zwischen 2012-2014 liegt, aber nur dann, wenn die ArtikelNr ="SU" & auch nur dann, wenn das der letzte Auftrag war.

Das heißt, ich muss irgendwie ein Limit auf die Details bringen, mit einem Join, der aber auf das Datum der Auftrag Tabelle verweist....

Tut mir leid, aber da stehe ich im Moment leider an.

DANKE im Voraus
 
Werbung:
So, was ich jetzt gerne hätte, wäre:
Alle Kunden, der Auftragstyp 'TypB" ist, das Datum zwischen 2012-2014 liegt, aber nur dann, wenn die ArtikelNr ="SU" & auch nur dann, wenn das der letzte Auftrag war.

Das heißt, ich muss irgendwie ein Limit auf die Details bringen, mit einem Join, der aber auf das Datum der Auftrag Tabelle verweist....

Tut mir leid, aber da stehe ich im Moment leider an.

DANKE im Voraus


Man kann auch auf das Resultat eines Selects joinen. Als grober Ansatz:

Code:
select AuftragId , ArtikelNr from Auftragdetails where ArtikelNr = 'SU'

und

Code:
select KundenID  , max(Datum) as Datum  from Auftrag group by KundenID

Ich denk mal, Du schaffst das.
 
Mahlzeit...

Habe folgendes versucht:

SELECT k.* FROM kundenstamm k
join auftrag auf on k.KundenId=auf.KundenId
join auftragdetails detail on auf.id=detail.auftragid
where year(max(auf.Datum)) between 2012 and 2014 and detail.artikelnr='SU' group by auf.KundenID;

Dabei kommt immer folgende Fehlermeldung: Invalid use of Group function.
!? auch wenn ich k.KundenId angebe kommt die selbe Fehlermeldung.

DANKE
 
Mahlzeit...

Habe folgendes versucht:

SELECT k.* FROM kundenstamm k
join auftrag auf on k.KundenId=auf.KundenId
join auftragdetails detail on auf.id=detail.auftragid
where year(max(auf.Datum)) between 2012 and 2014 and detail.artikelnr='SU' group by auf.KundenID;

Dabei kommt immer folgende Fehlermeldung: Invalid use of Group function.
!? auch wenn ich k.KundenId angebe kommt die selbe Fehlermeldung.

DANKE

Hab grad ned viel Zeit. Du sagst:

"
So, was ich jetzt gerne hätte, wäre:
Alle Kunden, der Auftragstyp 'TypB" ist, das Datum zwischen 2012-2014 liegt, aber nur dann, wenn die ArtikelNr ="SU" & auch nur dann, wenn das der letzte Auftrag war."

Dein Problem scheint das mit dem letzten Auftrag zu sein, oder?

Schnellschuß (unvollständig):

Code:
test=*# select * from kunde;
 id |  name
----+--------
  1 | kunde1
  2 | kunde2
(2 rows)

test=*# select * from auftrag ;
 id | kunde | typ |  datum
----+-------+-----+------------
  1 |  1 | a  | 2014-01-01
  2 |  1 | a  | 2014-02-01
  3 |  2 | b  | 2014-03-01
(3 rows)

test=*# select * from a_details ;
 id | a_id | artikel
----+------+---------
(0 rows)

Nun mal so:

Code:
test=*# select * from kunde left join (select distinct on (kunde) id, kunde, typ, datum from auftrag order by kunde, datum desc ) auftrag on kunde.id = auftrag.kunde left join a_details on auftrag.id=a_details.a_id;
 id |  name  | id | kunde | typ |  datum  | id | a_id | artikel
----+--------+----+-------+-----+------------+----+------+---------
  1 | kunde1 |  2 |  1 | a  | 2014-02-01 |  |  |
  2 | kunde2 |  3 |  2 | b  | 2014-03-01 |  |  |
(2 rows)

test=*# select * from kunde left join (select distinct on (kunde) id, kunde, typ, datum from auftrag where typ = 'b' order by kunde, datum desc ) auftrag on kunde.id = auftrag.kunde left join a_details on auftrag.id=a_details.a_id;
 id |  name  | id | kunde | typ |  datum  | id | a_id | artikel
----+--------+----+-------+-----+------------+----+------+---------
  1 | kunde1 |  |  |  |  |  |  |
  2 | kunde2 |  3 |  2 | b  | 2014-03-01 |  |  |
(2 rows)

test=*# select * from kunde left join (select distinct on (kunde) id, kunde, typ, datum from auftrag where typ = 'a' order by kunde, datum desc ) auftrag on kunde.id = auftrag.kunde left join a_details on auftrag.id=a_details.a_id;
 id |  name  | id | kunde | typ |  datum  | id | a_id | artikel
----+--------+----+-------+-----+------------+----+------+---------
  1 | kunde1 |  2 |  1 | a  | 2014-02-01 |  |  |
  2 | kunde2 |  |  |  |  |  |  |
(2 rows)

Im ersten noch ohne WHERE auf Auftrags-Typ, nur mit den letzten Bestellungen des Kunden.

Achtung: ich verwende PostgreSQL, das distinct on() ist eine PG-spezifische Erweiterung.
 
Werbung:
@ akretschmer
Danke, aber leider nein, Es scheint dass eine Gruppierung in einer Sub-Query in erlaubt ist. - Ich bekomme immer Invalid use of Group.
Das Thema ist die letzte Bestellung. sonst ist's kein großes Problem.

DANKE
 
Zurück
Oben