Frage zu Differenz

Hallo Leute,

Ich will mir hier ein kleines Haushaltsbuch für mehrere Leute basteln.

Dazu habe ich eine Tabelle dieser Art:

ID | Name | Wieviel | Wofuer | Datum 
1 | Guenther | 10,00 € | Nahrung | 12.10.2005
2 | Anne | 15,00 € | Nahrung | 12.10.2005
3 | ...

Nun will ich das in einer Kurzauswertung so anzeigen lassen, dass für jeden Namen die jeweilige Summe sowie die zu zahlende Differenz (Summe(Wieviel)/Anzahl(Namen)-Summe(Wieviel pro Person) rauskommt.

Ich komme hier aber irgendwie nicht voran. Wie baue ich denn das? Die Schwierigkeit liegt ja irgendwie in der Summe pro Person und in der Summe insgesamt, weil ich nicht weiß, wie ich die beiden in eine Abfrage bringe.

Für Hilfe bin ich dankbar.

der Guenther

Ach ja, ist ne Access-DB
Die Daten werden über ein Access-Formular eingegeben und dort soll auch diese kurzauswertung erfolgen. Das ganze mittels SQL oder wenn das einer verstanden hat, würde ich auch diesen dubiosen Assistenten benutzen, aber der kann nur SUM, AVG und das einfache.

der Guenther

Hallo Leute,

Ich will mir hier ein kleines Haushaltsbuch für mehrere Leute
basteln.

Dazu habe ich eine Tabelle dieser Art:

ID | Name | Wieviel | Wofuer | Datum
1 | Guenther | 10,00 € | Nahrung | 12.10.2005
2 | Anne | 15,00 € | Nahrung | 12.10.2005
3 | …

Du kannst mit geschachtelten Selects arbeiten. (Wenn Du statt Access die MSDE = SQL-Server Desktop Ed. benutzt sollte das so gehen. Habs aber nicht getestet)
SELECT ((SELECT SUM(wieviel)/COUNT(DISTINCT id)) FROM Tabelle t2) - SELECT (SUM(wieviel) FROM tabelle t3 WHERE t3.id = t.id))
FROM tabelle t
ORDER BY id;

Dein Datenmodell ist falsch. Du verletzt die 2.Normalform.
Besser:
Tabelle 1 (Person) {[id, name]}
Schlüssel: id
Tabelle 2 (Ausgaben) {[id,wieviel,wofuer, datum]}

Dann ist nur noch der Schlüssel falsch.
Besser:
Tabelle 2 (Ausgaben) {[id,lfdnr, wieviel,wofuer, datum]}
id und lfdnr sind der Schlüssel.
Schließlich hast Du zu einer Person viele Ausgaben.

In Access macht man das aber eher mit VB als mit SQL.

Gruß

Peter

Nun will ich das in einer Kurzauswertung so anzeigen lassen,
dass für jeden Namen die jeweilige Summe sowie die zu zahlende
Differenz (Summe(Wieviel)/Anzahl(Namen)-Summe(Wieviel pro
Person) rauskommt.

Ich komme hier aber irgendwie nicht voran. Wie baue ich denn
das? Die Schwierigkeit liegt ja irgendwie in der Summe pro
Person und in der Summe insgesamt, weil ich nicht weiß, wie
ich die beiden in eine Abfrage bringe.

Für Hilfe bin ich dankbar.

der Guenther

Mahlzeit,

zum Datenmodell wurde schon was gesagt. Zu deiner Frage möchte ich dir die Domainfunktionen von Access ans Herz legen. Diese berechnen einen einzelnen aggregierten Wert über eine sog. Domäne (vergleichbar einer Tabelle mit WHERE-Clausel), so daß du sie zeilenbezogen verwenden kannst:

select id,
 wieviel, 
 DAvg("wieviel", "MeineTabelle") - wieviel as zuzahlen,
 wofuer,
 datum
 from MeineTabelle;

Alternativ kannst du auch DSum(…) / DCOunt(…) verwenden.
Schau die Hilfe zu DCount, DSum, DAvg usw. an!

Gruß

Sancho

Hallo,

Dein Datenmodell ist falsch. Du verletzt die 2.Normalform.

Danke für deine Hilfe. Warum ist denn mein Datenmodell falsch? Ich versteh nicht ganz den Sinn, das in 2 Tabellen zu zerlegen mit zwei Schlüsseln in einer, wenn ich doch nur erfassen will wer wann wieviel ausgegeben hat. Wieso verletze ich da was? Rein aus der Logik heraus muss das doch so gehen. Ich meine das tut’s ja auch, nur eben nicht diese Kurzauswertung.

Sorry aber meine Datenbankenvorlesung war im 2. Semester. Könnt ihr mir das nochmal näher erläutern?

der Günther

Hallo,

die Normalisierung hilft Redundanzen und Anomalien zu vermeiden.

Beispiel: was machst Du, wenn zwei Personen den selben Namen haben. Dann kannst Du den einen nicht mehr vom anderen unterscheiden. In getrennten Tabellen hast Du den Namen halt zweimal (dann solltest Du ein Unterscheidungsmerkmal einführen)

Beispiel: Du willst einen davon Löschen. Also musst Du viele Datensätze über Nicht-Schlüsselattribute löschen. (Das ist wie Dosen ohne Ettiketten)

Beispiel: Du verschwendest Platz. Du musst den Namen immer mitschleppen. Wenn Du mehr zur Person hast, wird das immer teurer

Gruß

Peter

1 Like

Hallo Peter,

Danke für deine Erklärung. Das leuchtet mir natürlich ein. Aber darüber habe ich nicht nachgedacht, weil es vorrangig für kleine WGs ist und da kommt ein Name meist nur einmal vor oder es wird sich auf Kürzel geeinigt. Und der Platz ist auch nicht das entscheidende. Die Datei ist jetzt schon knapp 600kB groß, ohne dass da irgendwelche Daten drin stehen. Das Datenvolumen beläuft sich auf etwa 10 Einträge pro Monat pro Person. Ich dachte mir für so eine kleine Datenbank lohnt sich so ein Aufriss nicht. Obwohl du natürlich recht hast.

der Günther, der das nächste Mal dran denkt.