Mysql - Abfrage über mehrere Tabellen mit Summierung

Johnny80

Grünschnabel
Ich weiß nicht ob mein Vorhaben umsetzbar ist, aber vielleicht kann mir ja jemand helfen.
Und bitte nicht schlagen, ich bin kein Profi.

1. Fragestellung:
Es gibt 1 Tabelle mit Aufträgen und jeder Auftrag kann mehrere Einträge in der Kosten-Tabelle haben.
Die Abfrage gruppiert die Aufträge nach Rechnungsempfänger.
wie krieg ich es hin, den Gesamtbetrag pro Rechnungsempfänger ausgeben zu lassen?

SQL:
    LEFT JOIN (SELECT trip_id, SUM(tripco_totalprice) AS cost
    FROM tripcosts
    GROUP BY trip_id) costs ON (trips.trip_id = costs.trip_id)
... gibt mir nur die Summe von 1 Auftrag


2. Fragestellung
Die Rechnungsadresse kann Hauptsitz oder Filiale sein.
Im zweiten Fall sollten gewisse Werte von der Tabelle addressdetails des entsprechenden Hauptsitztes ausgelesen werden.


3. Fragestellung
Die Adressdetails-Tabelle hat folgende zwei Spalten: adrde_invoicemail und adrde_invoicepost, beide können 1 oder 0 enthalten.
Ist es möglich eine einzige ausgabe zu erhalten:
Wenn adrde_invoicemail=1 und adrde_invoicepost=0 => E-Mail
Wenn adrde_invoicemail=0 und adrde_invoicepost=1 => Post
Wenn adrde_invoicemail=1 und adrde_invoicepost=1 => E-Mail + Post


3. Fragestellung
Die Adressdetails-Tabelle hat folgende drei Spalten: adrde_fepec, adrde_fecode, adrde_fedelivery
Ist es möglich eine einzige ausgabe zu erhalten:
Wenn adrde_fedelivery=1 => adrde_fepec
Wenn adrde_fedelivery=2 => adrde_fecode


Hier meine Abfrage, wie sie im Moment aussieht:

SQL:
SELECT toinv_date, toinv_number, adr_name, country_vehiclecode, adrde_vatcode, adrde_taxcode, adrde_invoicemail, adrde_invoicepost,  adrde_fepec, adrde_fecode, adrde_fedelivery, CONCAT(adrde_invoicepaymentdays,' Tage ',paym_short,' + ',adrde_invoicepaymentplus) AS payment
      FROM toinvoice
      LEFT JOIN trips ON trips.trip_id = toinv_orderid
      LEFT JOIN addresses ON addresses.adr_id = billrecipient_id
      LEFT JOIN addressdetails ON addressdetails.adr_id = billrecipient_id
      LEFT JOIN countrys ON countrys.country_id = addresses.country_id
      LEFT JOIN paymentmetodes ON paym_id = invoicepaytype_id
      GROUP BY billrecipient_id
 
Zuletzt bearbeitet von einem Moderator:
Hast du ein Schema, wie die Tabellen zusammenhängen?

Zu deiner Abfrage. Du hast ein GROUP BY über 1 Feld. Aber du hast viel mehr Felder im SELECT. Was soll bei der Gruppierung mit denen passieren? Summen bilden? Anzahl berechnen?
MySQL ist glaub gnädig und geht davon aus, dass du sie ebenfalls im GROUP BY haben willst. Aber es ist so nicht suaber und nicht ganz klar was die Abfrage soll. Also mal alles was nicht mit einer Aggreagationsfunktion (SUM, COUNT etc) versehen ist gehört auch in den GROUP BY.
Wenn du das bei deiner Abfrage machst, dann merkst du, dass du keine einzige Aggregatiosnfunktion hast. Diene Gruppierung ist also ein eigentlich ein DISTINCT.

Zu deinen Fragen
1) Sorry, hab den Nulldurchblick. Deine Beschreibung hat anderen Namen als der SQL-Schnipsel. Ich sehe da keine Äufträge, Empfänger und Kosten im SQL

2) Ein einfacher LEFT JOIN auf die Tabelle mit den Haubtsitz sollte reichen

3) Klassischer CASE WHEN
SQL:
CASE
    WHEN adrde_invoicemail=1 AND adrde_invoicepost=0
    THEN 'email'
    WHEN adrde_invoicemail=0 AND adrde_invoicepost=1
    THEN 'post'
    WHEN adrde_invoicemail=1 AND adrde_invoicepost=1
    THEN 'email+post'
    ELSE 'NA'
END AS neuer_feldname

4) Ebenfalls CASE WHEN. Kann man aber kürzen, da alle When auf dasselbe Feld prüfen
SQL:
CASE adrde_fedelivery
    WHEN 1 THEN adrde_fepec
    WHEN 2 THEN adrde_fecode
    ELSE 'NA'
END AS neuer_feldname
 
Zurück