Gelöst: Dem 1 bzw. 2 Datensatz untersch. Wert zuordnen (1:N)

Datenbanklösungen mit AOO/LO

Moderator: Moderatoren

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

Gelöst: Dem 1 bzw. 2 Datensatz untersch. Wert zuordnen (1:N)

Beitrag von MEcki »

Hallo zusammen,

ich habe mal wieder ein Problem mit meiner Fördervereins-Datenbank.

Folgende (vereinfachte Tabellen)

MITGLIED:
id_Mitglied (Primärschlüssel)
Nachname
Vorname

Kinder:
id_Kind (Primärschlüssel)
id_Mitglied
Name
Vorname
ÜMI seit
Kündigung ÜMI zum:


KinderMonateÜMI:

id_Kinder (Primärschlüssel)
Datum (Primärschlüssel)
Betrag



1:N Beziehung zwischen Mitglied und Kinder
1:N Beziehung zwischen Kinder und UEMI

Also kann jedes Mitglied mehrere Kinder haben.
Pro Monat hat jedes Kind (bzw. die Eltern für das Kind) einen Betrag UEMI-Betrag) zu entrichten.

Die Abfrage, die mir jeweils eine Zeile Pro kind liefert ist ja in etwas so:

Code: Alles auswählen

SELECT distinct 
"Mitglieder"."ID_Mitglied", 
"Mitglieder"."KontoVorname", 
"Mitglieder"."KontoName", 
"Kinder"."ID_Kinder", 
"Kinder"."KindName", 
"Kinder"."KindVorname", 
"UEMI"."Betrag" FROM "Kinder" AS "Kinder", 
"Mitglieder" AS "Mitglieder",
 "UEMI" AS "UEMI" 

WHERE "Kinder"."ID_Mitglied" = "Mitglieder"."ID_Mitglied" 
    AND "UEMI"."id_Kinder" = "Kinder"."ID_Kinder" 
    AND "Kinder"."Kündigung" IS NULL

Das eigentliche Problem ist nun, dass der Betrag für das 1. Kind einer Familie (eines Mitglieds) 60€ beträgt.
Für das 2. Kind einer Familie sind 45€ fällig.
Ein (eventuelles) 3. Kind ist frei (0€)


Wie müsste hier die Abfrage lauten? Ich habe bisher dazu noch nichts gefunden, gehe von irgendeiner GROUP BY Clausel aus, mit der ich aber noch nicht wirklich klarkomme. Na, und wie ich das 1. bzw. 2. (3.) Element separat anspreche, weiss ich schon gleich gar nicht.

Danke schon mal für Eure Hilfe
Marco
Zuletzt geändert von MEcki am Sa, 04.09.2010 12:25, insgesamt 1-mal geändert.
MEcki
**
Beiträge: 25
Registriert: Do, 17.09.2009 10:31

Re: Dem 1 bzw. 2 Datensatz untersch. Wert zuordnen (1:N)

Beitrag von MEcki »

Hat keiner 'ne Idee?

Also mit

Code: Alles auswählen

SELECT 
"Mitglieder"."ID_Mitglied" 
FROM "Kinder" AS "Kinder", 
"Mitglieder" AS "Mitglieder" 
WHERE "Kinder"."ID_Mitglied" = "Mitglieder"."ID_Mitglied" 
	AND "Kinder"."ÜMI seit" IS NOT NULL 
	AND ( "Kinder"."Kündigung ÜMI zum:" IS NULL OR "Kinder"."Kündigung ÜMI zum:" > {D '2010-08-31' } ) 
GROUP BY "Mitglieder"."ID_Mitglied" 
HAVING ( ( COUNT( "Kinder"."KindVorname" ) = 1 ) )
bekomme ich zumindest die Eltern, die nur 1 Kind haben (( COUNT( "Kinder"."KindVorname" ) = 1 ...

und mit

Code: Alles auswählen

SELECT 
"Mitglieder"."ID_Mitglied" 
FROM "Kinder" AS "Kinder", 
"Mitglieder" AS "Mitglieder" 
WHERE "Kinder"."ID_Mitglied" = "Mitglieder"."ID_Mitglied" 
	AND "Kinder"."ÜMI seit" IS NOT NULL 
	AND ( "Kinder"."Kündigung ÜMI zum:" IS NULL OR "Kinder"."Kündigung ÜMI zum:" > {D '2010-08-31' } ) 
GROUP BY "Mitglieder"."ID_Mitglied" 
HAVING ( ( COUNT( "Kinder"."KindVorname" ) = 2 ) )
die Eltern, die nur 2 Kinder haben (( COUNT( "Kinder"."KindVorname" ) = 2 ...


Den Insert Into
in die Tabelle KinderMonateÜMI bekomme ich aber nicht hin.
Ich müsste dort ja die entsprechende id_Kinder aus der KINDER-Tabelle,
bei der Abfrage mit 1 Kind 60€ (bzw. bei der Abfrage mit 2 Kindern (60 + 45) / 2 = 52,50€, was mir auch genügen würde)
und das Monatsanfangsdatum (01.08.2010) einfügen.

mit

Code: Alles auswählen

INSERT INTO 
"KinderMonateÜMI" ("id_Kinder", "Betrag", "Datum") 
SELECT "ID_Kinder", 
'60' AS "Betrag" , 
'01.08.2010' As "Datum" 
FROM "Mitglieder", "Kinder"
WHERE 
"Kinder"."ID_Mitglied" = "Mitglieder"."ID_Mitglied" AND "Kinder"."ÜMI seit" IS NOT NULL 
AND ( "Kinder"."Kündigung ÜMI zum:" IS NULL OR "Kinder"."Kündigung ÜMI zum:" > {D '2010-08-31' } ) 
GROUP BY "Mitglieder"."KontoName", "Mitglieder"."KontoVorname" HAVING ( ( COUNT( "Kinder"."KindVorname" ) = 1 ) ) ORDER BY COUNT( "Kinder"."KindVorname" ) ASC
bekomme ich aber eine Fehlermeldung
1: Not in aggregate function or group by clause: org.hsqldb.Expression@17f3202 in statement [INSERT INTO
...



und da hört es dann bei meinem bisherigen SQL-Stand einfach auf.
Danke für Eure Hilfe
Marco
MEcki
**
Beiträge: 25
Registriert: Do, 17.09.2009 10:31

Re: Dem 1 bzw. 2 Datensatz untersch. Wert zuordnen (1:N)

Beitrag von MEcki »

Ich muss schon sagen, dieses Forum inspiriert mich ungemein. Hab zwar noch nicht genau das gefunden, was ich wollte, aber jedenfalls finde ich aus meiner DB jetzt heraus, welche Eltern 1 und welche mehrere Kinder haben und kann diesen dann Beträge zuordnen.
Was mich noch ein wenig stört ist, dass dem 1. Kind nun ggf. auch der Beitrag für ein zweites Kind "aufgebürdet" wird, aber letztendlich sollen ja die Eltern zahlen.

... und das ist der Code hierzu:

Code: Alles auswählen

Insert Into
"KinderMonateÜMI" ("id_Kinder", "Betrag", "gezahlt","Datum")

SELECT 
"Id_Kinder",

CASE WHEN "Anz" = 0 THEN '0' 
WHEN "Anz" = 1 THEN '60'
WHEN "Anz" = 2 THEN '105' 
ELSE '105' END AS "Betrag",
'True' as "gezahlt",
'2010-08-01' as "Datum"

From
(
SELECT MIN( "Kinder"."ID_Kinder" ) as "Id_Kinder", COUNT( "Kinder"."ID_Kinder" ) as "Anz" FROM "Kinder" AS "Kinder", "Mitglieder" AS "Mitglieder" WHERE "Kinder"."ID_Mitglied" = "Mitglieder"."ID_Mitglied" AND "Kinder"."ÜMI seit" IS NOT NULL AND ( "Kinder"."Kündigung ÜMI zum:" IS NULL OR "Kinder"."Kündigung ÜMI zum:" > {D '2010-08-31' } ) GROUP BY "Mitglieder"."KontoName"
)
Wäre schön, wenn noch jemand eine Idee hätte, wie ich noch dem 1. bzw. dem 2. Kind seinen jeweiligen Betrag zukommen lassen kann (wie ich Kind 1 bzw. Kind 2 direkt anspreche).
Hierzu zur Verdeutlichung vielleicht mal ein Screenshot der DB-Struktur
Struktur DB.JPG
Struktur DB.JPG (66.3 KiB) 1274 mal betrachtet
DPunch
*******
Beiträge: 1112
Registriert: Mo, 02.11.2009 16:16
Wohnort: Marburg

Re: Dem 1 bzw. 2 Datensatz untersch. Wert zuordnen (1:N)

Beitrag von DPunch »

Aloha

Versuch es mal so:

Code: Alles auswählen

SELECT
"ID_Kinder",
CASE
WHEN 
"ID_Kinder" IN 
(SELECT "ID_Kinder" FROM "Kinder" WHERE "ID_Mitglied" = "a"."ID_Mitglied" AND "ÜMI seit" IS NOT NULL AND ("Kündigung ÜMI zum:" IS NULL OR "Kündigung ÜMI zum:" > {D '2010-08-31' }) ORDER BY "ÜMI seit" ASC LIMIT 1 OFFSET 1) THEN '45'
WHEN "ID_Kinder" IN 
(SELECT "ID_Kinder" FROM "Kinder" WHERE "ID_Mitglied" = "a"."ID_Mitglied" AND "ÜMI seit" IS NOT NULL AND ("Kündigung ÜMI zum:" IS NULL OR "Kündigung ÜMI zum:" > {D '2010-08-31' }) ORDER BY "ÜMI seit" ASC LIMIT 1) THEN '60'
ELSE '0'
END AS "Betrag",
TRUE AS "gezahlt",
'2010-08-01' AS "Datum"
FROM "Kinder" "a"
WHERE "ÜMI seit" IS NOT NULL AND ("Kündigung ÜMI zum:" IS NULL OR "Kündigung ÜMI zum:" > {D '2010-08-31' })
MEcki
**
Beiträge: 25
Registriert: Do, 17.09.2009 10:31

Re: Dem 1 bzw. 2 Datensatz untersch. Wert zuordnen (1:N)

Beitrag von MEcki »

Genial,
dank ' Dir, DPunch,

noch das

Code: Alles auswählen

Insert Into
"KinderMonateÜMI" ("id_Kinder", "Betrag", "gezahlt","Datum")
davor und der Insert funktioniert genau so, wie ich mir das vorgestellt hatte!!!
Das mit dem LIMIT und OFFSET kannte ich noch gar nicht.

Marco
Antworten