Summenbildung

mikel

Aktiver Benutzer
Beiträge
38
Hallo zusammen,

ich möchte aus einer Tabelle Werte summieren. Bis jetzt bin ich auf folgendem Stand:

Code:
SQLStr = "SELECT kontenklassenid, kontenid, buchungsdatum, belegnr, buchungstext, haben, soll  FROM tbl_buchungen WHERE kontenklassenid=5"
Set rstDaten = CurrentDb.OpenRecordset(SQLStr, dbOpenDynaset)
With rstDaten
    .MoveFirst
    Do Until .EOF
     Kontenklasse = .Fields("kontenklassenid")
     Konten = .Fields("kontenid")
     Datum = .Fields("buchungsdatum")
     beleg = .Fields("belegnr")
     soll = .Fields("soll")
     summe = .Fields("haben")
    
.MoveNext
    Loop
    .Close
End With

Das Auslesen der Daten funktioniert auch perfekt. Allerdings möchte ich jetz die Summen von "haben" und "soll" dargestellt haben.
Wenn ich allerdings jetzt sum(haben) setze meckert er bzw der Kontenklassenid
Fehlermeldung
"In der Abfrage ist der angegebene Ausdruck "kontenklassenid" nicht Bestandteil einer Aggregatfunktion erhalten"

Wo liegt hier das Problem?
 
Werbung:
Nimm MySQL, das würde Dir hier keinen Fehler anzeigen, sondern ein Zufallsergebniss. Viel besser, oder?

Im Ernst: wenn Du aggregierst (sum() ist eine Aggregation) müssen alle Spalten ENTWEDER aggregiert werden ODER es muß nach diesen gruppiert werden.

Wenn man ein paar Minuten nachdenkt, wird auch klar, warum ...
 
Beispiel:

1.: Tabelle zu_gruppieren(id int primary key, val1 int, val2 int):
Code:
create table zu_gruppieren(id int primary key, val1 int, val2 int);

2.: Werte einfügen:
Code:
insert into zu_gruppieren(id, val1, val2) select 1, 1, 2 union select 2, 1, 3;

3.: Gruppierte Abfrage:
Code:
select count(id) from zu_gruppieren group by val1;

Resultat:
Code:
 count
-------
     2

4.: weitere Werte einfügen:
Code:
insert into zu_gruppieren(id, val1, val2) select 3, 2, 2 union select 4, 2, 3;

5.: selbe Abfrage erneut ausführen:
Code:
select count(id) from zu_gruppieren group by val1;

Resultat:
Code:
 count
-------
     2
     2

Erklärung:
Die Count-Funktion zählt alle einträge
Die Union wird nur verwendet, damit der Query wohl auch unter MySQL funktioniert (?) bei den insert...
Wir haben in Summe also 4 Datensätze eingegeben.
2 mit dem val1-wert "1"
2 mit dem val1-wert "2"
nachdem wir nach dem group by-befehl angeben, er solle nach dem val1-wert gruppieren, zählt er alle val1 werte zusammen, welche indent sind.

Ist jetzt nur schnell aus der Hand geschüttelt ;)
ich hoffe es kann dir helfen :D

PS: Überleg dir, ob MySQL für deinen Vorgang zwingend notwendig ist ;) habe auch zu Postgres gewechselt, und bin damit höchstzufrieden :D

EDIT:
Erklärung zu deiner Fehlermeldung:
Wenn man zB von 2 Personen aus 4 mal Würfeln zählen will, was wie oft was gewürfelt wurde, macht man das in etwa so:
Code:
select person, wurfzahl, count(wurfzahl) from wuerfen group by person, wurzahl;

Wieso?
Er summiert einerseits alle Würfe, sprich jeweils 4.
Wenn jetzt person 1 2 6er, 1 2er und 1 1er Würfelt kommt in etwa heraus:
1, 6, 2
1, 2, 1
1, 1, 1

wenn die person 2 mit 6 6ern dazukommt, kommt sowas heraus:
2, 6, 4

Das bedeutet wir haben in Summe unsere 8 Datensätze (Summe der 3. Spalte zusammenaddieren ganz einfach) und sehen welche Person welche Zahl wie oft gewürfelt hat.

Wenn man zB angeben möchte, ohne dass man die gezählten würfe nach einer Person gruppiert, versteht das Datenbanksystem nicht, wie es agieren soll. Von daher die Fehlermeldung, das ist nach dem Schema sortiere Fische nach >keiner Information<...

Ich weiß nicht, wie das im Fischhandel läuft, aber ich würde sie mal nach Fischart sortieren/gruppieren, und dann nach "Gewichtsklasse" (50-100 Gramm), und so weiter... wenn er aber nicht weiß, nach welchem Faktor er zusammenfassen soll, kommt der Fehler.

EDIT2:
ja, ich brauche dringend ein Hobby xD
 
Zuletzt bearbeitet:
select count(id) from zu_gruppieren group by val1;
Das ist eine sehr seltene Variante, Group By zu nutzen. Cool dass das mal jemand macht.
Andererseits vielleicht nicht sehr Praxis orientiert / verständlich für Anfänger.

Was bei dem Statement
SELECT kontenklassenid, kontenid, buchungsdatum, belegnr, buchungstext, haben, soll FROM tbl_buchungen WHERE kontenklassenid=5
des TE auffällt (der ja das fehlerhafte Summen Statement gar nicht gepostet hat), ist ein typisches "Missverständnis" / Anfängerfehler:
Das Statement enthält noch "ID"-Werte, und zwar nicht nur die "kontenklassenid" der Buchungsdatensätze, die zumindest dem Namen nach durchaus gruppierbar wäre, sondern sondern auch Werte, die namentlich schlecht gruppierbar sind, wie "belegnummer".
Eindeutige Werte zu gruppieren, bringt keinen Nutzen - wenn auch keine Fehler.

Naja, was er wirklich als Abfrage geschickt hat, weiß man ja (noch) nicht.
 
Hier eine Praxis-Orientierte Idee:

Ein Angler geht angeln... beim abwiegen seiner Erbeutung kommt folgende Datenbank:

1.: Eine Tabelle "Fischarten":
Code:
create table fischarten(id integer primary key, artenname text not null unique);

2.: Eine Tabelle "Fische":
Code:
create table fische(id integer primary key, fischart integer references fischarten(id), gewicht integer not null);

3.: Ein paar Werte einfügen:
Code:
insert into fischarten(id, artenname) values (1, 'Karpfen'), (2, 'Scholle'), (3, 'Kabeljau');
insert into fische(id, fischart, gewicht) values (1, 1, 300), (2, 1, 250), (3, 2, 150), (4, 2, 200), (5, 3, 500);

4.: Eine Abfrage, wieviele Fischarten es in Summe gibt:
Code:
select count(id) from fischarten;

Ergebnis:
Code:
3

5.: Eine Abfrage, wieviel Gramm welcher Fischart bei der letzten Angeltour geangelt wurden:
Code:
select sum(fische.gewicht) from fische inner join fischarten on (fische.fischart = fischarten.id) group by fischarten.artenname;

Ergebnis:
Code:
 sum | artenname
-----+-----------
 350 | Scholle
 550 | Karpfen
 500 | Kabeljau

oder meintest du, es ist untypisch nach einer Spalte zu gruppieren, die nicht im select vorkommt?
ich habe keine Ahnung mehr, wieso ich das so aus dem Kopf gemacht habe, habe ich wohl irgendwann und irgendwo mitgenommen ^^

Wohl bei meinem Lehrgang mit Mimoso und dem Zählen der Maschinen und nach Maschinentyp gruppieren oder so? (mich dunkel erinnere)
 
Wie gehabt, brauche andere Hobbys :S

Hier ein Beispiel mit noch mehr Tabellen und so weiter, falls das der nächste Schritt für den Thread-Autor wäre:
1.: Tabelle Fischarten erstellen
Code:
create table fischarten(id integer primary key, artenname text not null unique);

2.: Tabelle Häfen erstellen
Code:
create table häfen(id integer primary key, name text unique not null);

3.: Tabelle Fischfang erstellen
Code:
create table fischfang(id integer primary key, fischart integer references fischarten(id), gewicht integer not null,
hafen integer references häfen(id));

4.: Überall Werte einfügen
Code:
insert into fischarten(id, artenname) values (1, 'Karpfen'), (2, 'Scholle'), (3, 'Kabeljau');
insert into häfen(id, name) values (1, 'Donau Wien'), (2, 'Unterelbe Hamburg');
insert into fischfang(id, fischart, gewicht, hafen) values (1, 1, 300, 1), (2, 1, 250, 1), (3, 2, 150, 1)
, (4, 2, 200, 1), (5, 3, 500, 1), (6, 1, 300, 2), (7, 1, 250, 2), (8, 2, 150, 2), (9, 2, 200, 2), (10, 3, 500, 2);

5.: Die Abfrage, um die gefischten Fischarten in Gramm pro Hafen anzuzeigen:
Code:
select sum(gewicht), fischarten.artenname, häfen.name from fischfang inner join fischarten on (fischarten.id = fischfang.fischart)
inner join häfen on (häfen.id = fischfang.hafen) group by fischarten.artenname, häfen.name order by artenname, name;

Resultat (bei meinen angegebenen Datensätzen):
Code:
 sum | artenname |       name
-----+-----------+-------------------
 500 | Kabeljau  | Donau Wien
 500 | Kabeljau  | Unterelbe Hamburg
 550 | Karpfen   | Donau Wien
 550 | Karpfen   | Unterelbe Hamburg
 350 | Scholle   | Donau Wien
 350 | Scholle   | Unterelbe Hamburg

Erklärung meiner Idee:
Wenn man eine "Holding"-Firma von mehreren Fischer-Betrieben ist und sehen möchte wo welche Investition sinnvoller wäre, ich habe jetzt nur den Fischfang dokumentiert, ich denke da spielen deutlich mehr Parameter mit...
Fischreichtum an dem Hafen, maximal einsetzbare Personen am Schiff, Parkgebühr, Verkaufswert in der nächsten Umgebung, etc...
 
Werbung:
Zurück
Oben