PDA

Vollständige Version anzeigen : Summierung


MarioR
17.07.2001, 19:25
Hallo SQLer,

die Frage hab ich zwar schon im Access-Forum gestellt, aber vielleicht könnt ihr mir auch weiterhelfen.

Ich hab eine Datenquelle "Anrufe_2", die folgende Daten enthält:

Zeit SWert
12:01 1
12:32 1
12:45 1
12:53 -1
13:03 1
...

Jetzt möchte ich eine laufende Summe für SWert über alle Datensätze bilden. Dafür hat mir Access diesen SQL-String erstellt:
SELECT Anrufe_2.Zeit, Sum(Anrufe_2.SWert) AS [Summe von SWert]
FROM Anrufe_2
GROUP BY Anrufe_2.Zeit;

Dummerweise summiert Access nur innerhalb einer Gruppe. Also erhalte ich wieder die Quelldaten. Ich hätte das Ergebnis aber gern so:

Zeit [Summe von SWert]
12:01 1
12:32 2
12:45 3
12:53 2
13:03 3
...

Geht das irgendwie oder muss ich nach einer anderen Lösung suchen? Hat jemand eine Idee?

Joachim Hofmann
18.07.2001, 15:39
Hallo MarioR,

praktisch wäre es, wenn Du kurz gesagt hättest, was die anderen denn Dir schon geraten haben, oder ob es denn schon geht, nur Du möchtest es besser oder.....

Nun weiß ich z.B. nicht ob man schon geklärt hat, das es wahrscheinlich per Bericht lösbar ist..

Mit reinem SQL geht es auf *einen Schlag* nicht.
*Jede einzelne* Summe läßt sich mit (ich schreibe hier nur das Prinzip auf, ohne Access-Funktionen/Formate):


SELECT Sum(Anrufe_2.SWert) AS SummeSWert
FROM Anrufe_2
WHERE (((Anrufe_2.Zeit)<= #HIER DIE GEW. ZEIT (die der betr. Zeile) EINTRAGEN# ))

ermitteln.

Falls Du weißt, wie man mit Recordsets in Access arbeitet, sage ja, dann könnte ich vom Prinzip her sagen, wie man es mit Recordset & UPDATE machen könnte.

MarioR
18.07.2001, 16:28
Hallo Achim,

Asche auf mein Haupt, hier ist der Link zu meinem Access-Beitrag:
Summierung in Abfragen (http://www.ms-office-forum.net/forum/showthread.php?s=&threadid=46057)

Ich hab schon versucht, die Sache mit DSum bzw. einer Variablen in den Griff zu bekommen. Aber das eine dauert ziemlich lange und das andere bringt unklare Ergebnisse.

Mit Recordset beweg ich mich noch auf etwas wackligen Füssen, aber ich würde gern Deine Idee hören. Vielleicht kann ich's irgendwie umsetzen.
Ist es eigentlich möglich eine Art "Unterabfragen" zu erstellen, die mir die Summen liefern (und womöglich schneller als DSum sind)?

Danke für Deine Hilfe

<font size="1" face="Century Gothic">Moderatorenanmerkung: Überarbeitung, durch den Wechsel der Forensoftware zum 01.01.2003 verursacht: in diesem Beitrag Link(s) korrigiert.
jinx – 19.07.2003</font>

Joachim Hofmann
18.07.2001, 17:49
hm, ich habe es mal mit UPDATE und SELECT in einer einzigen Aktualisierungsabfrage ausprobiert, aber das frißt Access nicht. Ich arbeite mehr direkt auf einem SQL Server, da geht sowas.

Leider habe ich keine Zeit, weiteres in Access auszuprobieren.
*Meine* Idee wäre, eine neue Spalte "lSumme" für die Summierungen zu erstellen und diese Felder "auf Knopfdruck" zu aktualisieren.

Irgendwie wird das gehen, wenn man einen Recordset aufmacht, diesen über alle Zeilen laufen läßt und ein Recordset-Update für jede einzelne Zeile macht, indem man den Ausdruck "Summe aller Werte bis zum aktuellen SWert" errechnet (SWert kommt dann aus dem RecordSet und entspräche der Variable #HIER DIE GEW. ZEIT (die der betr. Zeile) EINTRAGEN# in meinem letzten Beitrag) und dann das aktuelle Feld "lSumme" "Recordset-Updated".
Habe nur leider keine Zeit, das umzusetzen.

joro
20.07.2001, 09:49
Hallo MarioR,
mit zwei Abfragen funktioniert es. In der ersten erzeugst du eine Hilfstabelle (tab2) mit einer Spalte, in die du die Zeit-Einträge aus deiner Tabelle (tab1)kopierst.

Die zweite Abfrage lautet dann:

SELECT Sum(tab1.Wert), tab2.zeit
FROM tab1 RIGHT OUTER JOIN tab2 ON tab1.zeit <= tab2.zeit
GROUP BY tab2.zeit;

MarioR
20.07.2001, 18:56
Hallo,

danke erstmal für Deine Antwort.

Leider ist das Zeitverhalten ähnlich schlecht wie mit den anderen Lösungen mit Sum oder DSum. :(
Ich habe in der Zwischenzeit den Gedanken mit der Funktion nochmal aufgegriffen (Beitrag Access-Forum) und lasse das Ergebnis in eine Tabelle schreiben. Damit ändern sich die Werte beim Blättern nicht mehr und mit der Geschwindigkeit bin ich auch zufrieden.

C. Palmetshofer
23.07.2001, 11:47
SELECT a.BUNr, Sum(b.Preis) AS SummePreis
FROM Buchungen as a, Buchungen as b
where b.BUNr <= a.BUNr
GROUP BY a.BUNr;

Gruss

MarioR
23.07.2001, 17:36
Hallo Christoph,

danke für Deine Bemühungen. Leider wieder das gleiche Problem: die Zeit :rolleyes:

Langsam gewinne ich den Eindruck, dass Sum für dieses Problem wirklich zu langsam ist. Es werden ja jedes Mal wieder alle vorhergehenden DS summiert! Und ich hab's nur mit rund 2000 DS probiert, das Programm wird auf etwa die 100fache Datenmenge losgelassen!