Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

Limit in Joins...

Dieses Thema im Forum "MySQL und MariaDB" wurde erstellt von Zero-G., 13 März 2014.

  1. Zero-G.

    Zero-G. Benutzer

    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
     
  2. akretschmer

    akretschmer Datenbank-Guru


    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.
     
  3. Zero-G.

    Zero-G. Benutzer

    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
     
  4. akretschmer

    akretschmer Datenbank-Guru

    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.
     
  5. Zero-G.

    Zero-G. Benutzer

    @ 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
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden