Select über 2 Tabellen mit Summen - Zusammenfassung

rfoehring

Neuer Benutzer
Beiträge
2
Hallo ... derzeit stehe ich etwas auf dem Schlauch und komme nicht zu dem gewünschten Ergebnis.

Ausgangslage: ich habe 2 Tabellen "Events" & "Bookings"
Events hat eine ID, Bezeichnung, Datum, Status und diverse andere Felder
Bookings beinhaltet die jeweiligen Buchungen dazu, ebenfalls mit der ID, Status, gebuchte Plätze usw.

Ich habe mit folgendem SELECT hinbekommen, dass die Buchungen zusammengefasst pro Veranstaltung dargestellt werden können, für das aktuelle Tagesdatum,

SELECT
`nt_em_events`.`event_id` AS `event_id`,`nt_em_events`.`event_name` AS `event_name`,
(`nt_em_events`.`event_spaces`) AS `event_spaces`,
sum(`nt_em_bookings`.`booking_spaces`) AS `booking_spaces`,
sum((case when (`nt_em_bookings`.`booking_status` = 1) then `nt_em_bookings`.`booking_spaces` else 0 end)) AS `booking_approved`,
sum((case when (`nt_em_bookings`.`booking_status` = 5) then `nt_em_bookings`.`booking_spaces` else 0 end)) AS `booking_reserved`
from (`nt_em_events`
left join `nt_em_bookings` on((`nt_em_events`.`event_id` = `nt_em_bookings`.`event_id`)))
where ((`nt_em_events`.`event_start_date` = curdate()) and (`nt_em_events`.`event_status` = 1) and ((`nt_em_events`.`recurrence` = 0) or isnull(`nt_em_events`.`recurrence`)))
group by `nt_em_events`.`event_id`


(die gebuchten Plätze werden mittels 'case when' noch getrennt summiert)

Das Ergebnis sieht dann so aus:
upload_2020-7-14_11-33-54.png

Soweit alles schön und gut :) - dieser Select liefert mir genau das, was ich wollte.

Nun wollt ich zusätzlich eine zweit Abfrage erstellen, die mir genau die oben genannte Ergebnisse liefert, allerdings nicht pro Veranstaltung, sondern als Gesamtsummen für den Kalendertag. Also eine einzige Summenzeile für den Kalendertag, die mir die oben gezeigten 4 Spalten mit Werte summiert und dann nur noch das Datum anzeigt, z.B. so:
upload_2020-7-14_11-50-53.png

Ich bekomme es einfach nicht geregelt :( wenn ich zusätzlich noch die event_spaces summiere, (ohne group by) dann kann die Summe nicht korrekt sein, da aufgrund des LEFT JOIN die Werte wohl mehrfach summiert werden pro Veranstaltung. Auch habe ich schon diverse andere Kombinationen von JOIN probiert, aber, wie eingangs erwähnt, ich komme hier nicht weiter.

Ich hoffe, dass mir einer der Experten hier einen hilfreichen Tipp geben kann :)
 

Anhänge

  • upload_2020-7-14_11-39-28.png
    upload_2020-7-14_11-39-28.png
    22,6 KB · Aufrufe: 1
Werbung:
eigentlich ganz einfach: bei Aggregationen (also sum() etc.) müssen alle Spalten im Resultat entweder aggregiert oder gruppiert sein. Dein gezeigtes SQL verstößt gegen diese Regel und würde in anderen Datenbanken und auch in aktuellen MySQL-Inkarnationen als syntaktisch falsch abgewiesen werden.
 
Sorry, ich hatte hier zur besseren Lesbarkeit den SELECT etwas zerlegt (ich nutze HeidiSQL hierfür), bevor ich ihn hier darstelle, dabei offensichtlich ein kleiner Fehler unterlaufen.
Der Original-Select sieht so aus (und funktioniert auch):
select `nt_em_events`.`event_id` AS `event_id`,`nt_em_events`.`event_name` AS `event_name`,`nt_em_events`.`event_spaces` AS `event_spaces`,sum(`nt_em_bookings`.`booking_spaces`) AS `booking_spaces`,sum((case when (`nt_em_bookings`.`booking_status` = 1) then `nt_em_bookings`.`booking_spaces` else 0 end)) AS `booking_approved`,sum((case when (`nt_em_bookings`.`booking_status` = 5) then `nt_em_bookings`.`booking_spaces` else 0 end)) AS `booking_reserved` from (`nt_em_events` left join `nt_em_bookings` on((`nt_em_events`.`event_id` = `nt_em_bookings`.`event_id`))) where ((`nt_em_events`.`event_start_date` = curdate()) and (`nt_em_events`.`event_status` = 1) and ((`nt_em_events`.`recurrence` = 0) or isnull(`nt_em_events`.`recurrence`))) group by `nt_em_events`.`event_id`

Deine Antwort klingt so, als ob es ganz einfach ist, für mich leider nicht, da ich kein DB-Entwickler bin, sondern mich immer anhand von Beispielen "vesuche", zu gewünschten Ergebnissen zu kommen. Hättest du evtl. eine kleine syntaktische Hilfestellung für mich, also was wo stehen sollte?
 
Werbung:
zuerst einmal kannst Du zählen, wie viele Spalten im Resultat sind. Ich komme auf 7. Davon 3 Aggregationen. Also müßten die anderen 4 im GROUP BY auftauchen. Überprüfe bitte selber.
 
Zurück
Oben