hab folgendes Problem, bin Access Neuling und möchte jetzt gern mal einen Durchschnitt berechnen, allerings nicht an einer Spalte sondern an einer Zeile. Bei mir steht in einer Zeile am Anfang die ID (Schlüssel) dann verschieden Zahlen und dann soll in der letzten Spalte der Durchschnitt ausgerechnet werden. Also noch mal von einem Datensatz (Reihe) soll der Durchschnitt berechnet werden.
Danke, aber soviel hab ich auch noch, bloß mein großes Problem ist der Durchschnitt, klar normalerweise alles addieren durch die Anzahl, allerdings sind es nicht immer 7 Werte es können 3 (Minimum), 4, 5 oder auch 6 sein. Wie bringe ich in diese Formel die Anzahl der vorhandenen Werte rein?? (muss doch dann mit dem Kriterium Ist nicht Null berechnet werden, oder??)
…könnte so gehen:
select feld1, …
(feld1+feld2+…+feld10)/ (iif(feld1 is null, 0, 1)+iif(feld2 is null, 0, 1)+…iif(feld10 is null, 0, 1)) as durchschnitt
from tabelle;
Zugegeben unschön.
Tip: Wenn Du auf solche unschönen Verrenkungen bei der Abfrage Deiner Daten kommst, spricht einiges dafür, daß Dein Datenmodell fehlerhaft ist.
…tschuldigung, daß ich mich eingemischt habe und den Vorschlag mit der Abfrage und dem berechneten Feld losgelassen habe. Hab’s halt Deinen Angaben nach, ein Anfänger zu sein, gestalten wollen. Wenn Du darüberhinaus doch schon erwachsener bist, muß ich Dir halt leider auch sagen, daß Dein Datenmodell nicht und niemals stimmen kann (hat ja einer der Vorredner auch schon so gemeint). Verstehe übrigens absolut nicht, warum eine Tabelle mal 5 und dann wieder vielleicht auch mal 7 Spalten hat (das ist niemals der Job einer Tabelle, so variabel sein zu müssen - geht auch gar nicht.). Wenn zu speichernde Informationen variabel sind, dann ist das in der Tat eine Frage der richtigen Struktur und wird niemals nur auf der Ebene EINER Tabelle gelöst. Aber wo ist Dein Problem? Wenn Du zehn oder zwanzig Tabellenfelder hast, berechne doch deren Durchschnitt wie sich das gehört (Abfrage, und die dann als Formulargrundlage von mir aus) - Summe des Ganzen geteilt durch Anzahl der Faktoren. Was ist daran so abartig?
die entscheidende Frage ist, wo willst du die Daten sehen?
Falls du die Daten in einem Formular sehen willst, fügst du alle Felder ein, erstellst im Formualar ein Feld Durchschnitt, wählst dann unter Eigenschaften Steuerelementinhalt, dann auf … und dann wählst du dein Formular aus und baust eine Formel auf wie bereits in den anderen Beiträge beschrieben (feld1 + feld2 + … + feld7)/7, Dann sollte das Formular den Durchschnitt anzeigen.
Falls du das Ganze in einer Abfrage oder gar in einem Datenbankfeld sehen willst, muß man allerdings anders vorgehen.
nach soviel vernichtender Kritik an Deiner Datenbankstruktur muß ich Dir doch mal Hoffnung machen.
Entgegen anderslautender Kommentare in diesem Brett gibt es sehrwohl Datenbanken, die mit wechselnden Tabellenstrukturen (unterschiedliche Spaltenanzahl etc.) fertig werden (müssen!) und trotzdem wunderbar funktionieren.
Auch ich stand vor einem solchen Problem und will Dich hier nicht im Regen stehen lassen.
Wenn Du willst, schicke ich Dir eine kleine Beispiel-MDB.
Leider kann ich Dir diese Datei frühestens am Freitag abend schicken.
Access versteht grundprinzipiell Tabellen als strukturierten Speicherort für strukturiert abzulegende Daten und meines Wissens als nichts anderes. Gib’ mir bitte einen kleinen Tipp, warum ich mal 5 oder mal 7 Spalten haben muß. Das geht mir gegen jeden datenbanktheoretischen Denkansatz. Bitte überzeuge mich.
Hi Stephan,
mach den Jungen nicht gleich so fertig - er hat doch schon geschrieben, daß er ein Neuling ist.
Er hat sich ungenau ausgedrückt, aber ich habe das so verstanden, daß die Tabelle nicht ihre Spaltenanzahl ändert, sondern daß manche Felder mal keinen Inhalt besitzen (also NULL sind).
Das geht mir
gegen jeden datenbanktheoretischen Denkansatz.
Nun ja, Access und Datenbanktheorie sind doch zwei Paar Schuh
Über dein Datenmodell lass ich mich besser nicht auch noch aus…
Hier ist eine allgemeine Durchschnittsfunktion:
Public Function Avrg(ParamArray p())
Dim V As Double, I As Long, n As Long
V = 0#: n = 0
For I = LBound(p) To UBound(p)
If Not IsNull(p(I)) Then
V = V + p(I)
n = n + 1
End If
Next I
If n = 0 Then
Avrg = Null
Else
Avrg = V / n
End If
End Function