Gelöst: Zusammenfass. von Abfrageerg. aus mehreren Tabellen

Datenbanklösungen mit AOO/LO

Moderator: Moderatoren

MEcki
**
Beiträge: 25
Registriert: Do, 17.09.2009 10:31

Gelöst: Zusammenfass. von Abfrageerg. aus mehreren Tabellen

Beitrag von MEcki »

Hallo,

ich setzte seit 1 Jahr OOO Base zur Verwaltung eines schulischen Fördervereins ein.
Mitglieder und deren Kinder werden verwaltet sowie die kostenpflichtige Teilnahme der Kinder an der UEMI (Übermittagsbetreuung) sowie eines Mittagessens verwaltet.
UEMI Beiträge wurden bereits eingezogen, Essensrechnungen als Serienbrief bzw. -email generiert.
Ist zwar noch nicht ganz Idiotensicher, weil manuell Hand an Abfragen gelegt werden muss, funktioniert aber soweit ganz gut.

Nach den Sommerferien ändern sich die Abrechnungsmodalitäten, d.h. nicht nur die UEMI Beiträge, sondern auch das Essen wird jetzt eingezogen.

Ich würde gerne pro Kind, oder besser noch Pro Mitglied eine Rechnungsaufstellung machen, die sämtliche fälligen Beträge für den Monat erhält und diese dann per Serienmail versenden. Parallel die fälligen Beiträge einziehen.

Mein eigentliches Problem besteht nun darin, dass ich die SQL-Abfrage zwar dahingehend fertig habe, dass alle fälligen Beträge untereinander in einer Abfrage den jeweiligen Personen zugeordnet erscheinen, ich aber die weitere Zusammenfassung aller Beträge eines Kindes bzw. einer Familie nicht hinbekomme. (Siehe Abfrage UEMI und Essen Aug2010)

Probleme bestehen ggf. auch dadurch, dass z.B. LehrerInnen / BetreuerInnen Essen zahlen müssen, aber natürlich keine Betreuungskosten.

Eine mit Beispieldaten gefüllte DB liegt bei und Abfragen für einen Beispielmonat sind darin enthalten, damit die DB-Struktur klarer wird.

Meine (hoffentlich) bestmögliche Abfrage aktuell:

Code: Alles auswählen

SELECT distinct "Mitglieder"."KontoVorname", "Mitglieder"."KontoName", "Kinder"."KindName", "Kinder"."KindVorname", "KinderMonateUEMI"."Betrag" as "Betrag", "KinderMonateUEMI"."Datum", 'UEMI' as "Art" 
FROM "Kinder", "Mitglieder", "KinderMonateUEMI" 
WHERE "Kinder"."ID_Mitglied" = "Mitglieder"."ID_Mitglied" 
	AND "KinderMonateUEMI"."id_Kinder" = "Kinder"."ID_Kinder" 
	AND "KinderMonateUEMI"."Datum" = {D '2010-08-01' }

union

SELECT distinct "Mitglieder"."KontoVorname", "Mitglieder"."KontoName", "Kinder"."KindName", "Kinder"."KindVorname", "KinderMonateEssen"."AnzahlEssenKind" * 3.5 AS "Betrag", "KinderMonateEssen"."Datum", 'Essen' as "Art"
FROM "KinderMonateEssen", "Kinder", "Mitglieder" 
WHERE "KinderMonateEssen"."id_Kinder" = "Kinder"."ID_Kinder" 
	AND "Kinder"."ID_Mitglied" = "Mitglieder"."ID_Mitglied" 
	AND "KinderMonateEssen"."Datum" = {D '2010-08-01' }

Ist es jetzt irgendwie möglich die Abfrage (Siehe Abfrage UEMI und Essen Aug2010) so zu gestalten, dass das Abfrageergebnis
KontoVorname | KontoName | KindName | KindVorname | BetragEssen | BetragUEMI | Datum

ausgibt.
Dann könnte ich wenigstens pro Kind eine Aufstellung machen. Pro Familie (also wenn eine Familie mehrere Kinder hat) eine Auftellung wäre
die unwichtigere Variante.

Hoffe, es kann mir da jemand helfen.
Besten Dank schon mal
M_Ecki
Dateianhänge
BeispielDB_FGGM.odb
(14.5 KiB) 42-mal heruntergeladen
Zuletzt geändert von MEcki am Mo, 30.08.2010 09:00, insgesamt 1-mal geändert.
MEcki
**
Beiträge: 25
Registriert: Do, 17.09.2009 10:31

Re: Zusammenfassung von Abfrageergebnissen aus mehreren Tabellen

Beitrag von MEcki »

Ich hatte schon gedacht, folgende - völlig andere Abfrage- wäre die Lösung. Dabei kommt allerdings (auf den Livedaten) zu jedem der Ergebnisse aus dem Join "KinderMonateEssen" ALLE Einträge des entsprechenden Kindes aus "KinderMonateUEMI" enthält.

Code: Alles auswählen

SELECT distinct "Mitglieder"."ID_Mitglied", "Kinder"."ID_Kinder", "Mitglieder"."KontoName", "Mitglieder"."KontoVorname", "Kinder"."KindName", "Kinder"."KindVorname", "KinderMonateEssen"."AnzahlEssenKind", "KinderMonateUEMI"."Betrag"
FROM "Mitglieder"
INNER JOIN "Kinder" ON "Mitglieder"."ID_Mitglied" = "Kinder"."ID_Mitglied"
left JOIN "KinderMonateEssen" ON "Kinder"."ID_Kinder" = "KinderMonateEssen"."id_Kinder"
left JOIN "KinderMonateUEMI" ON "Kinder"."ID_Kinder" = "KinderMonateUEMI"."id_Kinder"
WHERE "KinderMonateEssen"."Datum" = {D '2010-08-01' } OR "KinderMonateUEMI"."Datum" = {D '2010-08-01' }
Kann ich da jetzt evtl. eine JOIN aus "KinderMonateEssen" und eine aus "KinderMOnateUEMI" über ein UNION verbinden, dass wirklich die gewollten Datensätze angezeigt werden?

M_Ecki
MEcki
**
Beiträge: 25
Registriert: Do, 17.09.2009 10:31

Re: Zusammenfassung von Abfrageergebnissen aus mehreren Tabellen

Beitrag von MEcki »

Ich glaube (hoffe), jetzt hab ich es wirklich.

Code: Alles auswählen

......
FROM "Mitglieder"
INNER JOIN "Kinder" ON "Mitglieder"."ID_Mitglied" = "Kinder"."ID_Mitglied"
left JOIN "KinderMonateEssen" ON "Kinder"."ID_Kinder" = "KinderMonateEssen"."id_Kinder" AND "KinderMonateEssen"."Datum" = {D '2010-07-01' } AND "KinderMonateEssen"."AnzahlEssenKind" > 0

left JOIN "KinderMonateÜMI" ON "Kinder"."ID_Kinder" = "KinderMonateÜMI"."id_Kinder" AND "KinderMonateÜMI"."Datum" = {D '2010-07-01' }

die Datumsabfrage jeweils mit in den left Join


zusätzlich ist das ganz noch etwas komplizierter geworden, weil ich DB NULL noch in eine 0 wandeln musste, da sonst die Addition der Beträge nicht funktionierte.
Letztendlich sieht der ganz SQL-Code so aus (um den Euch nicht vor zu enthalten)/Hoffe, das nützt mal irgend einem anderen Nutzer:
Die Umlaute aus meiner Live-Tabelle habe ich nicht mehr gewandelt.

Code: Alles auswählen

SELECT distinct 
"Mitglieder"."ID_Mitglied",  
"Mitglieder"."KontoName", 
"Mitglieder"."KontoVorname",
"Mitglieder"."Straße",
"Mitglieder"."PLZ",
"Mitglieder"."Ort", 
"Mitglieder"."KontoNr",
"Mitglieder"."KontoBLZ",
"Mitglieder"."KontoKreditinstitut",
"Kinder"."ID_Kinder",
"Kinder"."KindName", 
"Kinder"."KindVorname", 
CASE 
	WHEN "KinderMonateEssen"."AnzahlEssenKind" > 0 
		THEN ("KinderMonateEssen"."AnzahlEssenKind"*3.5) 
		ELSE 0 
	END As "Betrag_Essen",
CASE 
	WHEN "KinderMonateÜMI"."Betrag" > 0 
		THEN "KinderMonateÜMI"."Betrag" 
		ELSE 0 
	END As "Betrag_UEMI",
CASE 
	WHEN "KinderMonateEssen"."AnzahlEssenKind" > 0 
		THEN ("KinderMonateEssen"."AnzahlEssenKind"*3.5) 
		ELSE 0 
	END + 
	CASE 
		WHEN "KinderMonateÜMI"."Betrag" > 0 
			THEN "KinderMonateÜMI"."Betrag" 
			ELSE 0 
		END as "Summe"


FROM "Mitglieder"
INNER JOIN "Kinder" ON "Mitglieder"."ID_Mitglied" = "Kinder"."ID_Mitglied"
left JOIN "KinderMonateEssen" ON "Kinder"."ID_Kinder" = "KinderMonateEssen"."id_Kinder" AND "KinderMonateEssen"."Datum" = {D '2010-07-01' } AND "KinderMonateEssen"."AnzahlEssenKind" > 0

left JOIN "KinderMonateÜMI" ON "Kinder"."ID_Kinder" = "KinderMonateÜMI"."id_Kinder" AND "KinderMonateÜMI"."Datum" = {D '2010-07-01' }


WHERE 
CASE 
	WHEN "KinderMonateEssen"."AnzahlEssenKind" > 0 
		THEN ("KinderMonateEssen"."AnzahlEssenKind"*3.5) 
		ELSE 0 
	END + 
	CASE 
		WHEN "KinderMonateÜMI"."Betrag" > 0 
			THEN "KinderMonateÜMI"."Betrag" 
			ELSE 0 
		END >0
Antworten