laufende Summen in Abfrage

RC_TRUCKER

Neuer Benutzer
Beiträge
3
Mit folgendem SQL-Code erzeuge ich die folgende Abfrage aus der Tabelle "Interessenten":

SELECT
Interessenten.[Datum Beitrittserklärung] AS Datum,
Sum(Interessenten.Anteile_akt) AS Anteile
FROM
Interessenten
GROUP BY
Interessenten.[Datum Beitrittserklärung]
HAVING
(((Sum(Interessenten.Anteile_akt)) IS NOT NULL))
ORDER BY
Interessenten.[Datum Beitrittserklärung];


1757951422973.webp

Ich möchte nun in einer weiteren Spalte die laufende Summe ergänzen.

Hierzu habe ich den SQL-Code im SELECT-Bereich mit folgender Zeile erweitert

Sum(Interessenten.Anteile_akt) OVER (Interessenten.[Datum Beitrittserklärung] ) AS laufende_Summe
Beim Ausführen kommt folgende Fehlermeldung:
1757951793082.webp

Wo liegt hier der Syntaxfehler?

Vielen Dank für die Unterstützung
 
Werbung:
MS Access bietet viele Standardfunktionen nicht. Entweder es müssen andere Funktionen dafür verwendet werden oder es muss programmiert werden. Hier kannst Du Dir ein Beispiel ansehen, wie eine Running Total Funktion in MSSQL Server (und anderen System, die da Standardkonform sind) funktionieren würde.
In MS Access hilft Dir vielleicht die Funktion DSUM, aber ich hab da keine Aktien mit MS Access.
 
Running Total nutzt bei allen DBs ganz klassisch Window-Funktionen, wie z.B. sum() OVER. Nach meinem Wissen gehen die mit Access gar nicht, daher wohl der Syntax-Fehler (wobei du auch ORDER BY vergessen hast?!). Mit Standard SQL kann man das ersetzen, aber wie praktikabel und schnell das ist, kann ich nicht sagen.

Jetzt mal so aus dem Bauch raus:
Code:
SELECT *,
(SELECT sum(Interessenten.Anteile_akt) FROM Interessenten WHERE Interessenten.[Datum Beitrittserklärung] <= t.Datum) AS lfd_summe
FROM (

SELECT
Interessenten.[Datum Beitrittserklärung] AS Datum,
Sum(Interessenten.Anteile_akt) AS Anteile
FROM
Interessenten
GROUP BY
Interessenten.[Datum Beitrittserklärung]
HAVING
(((Sum(Interessenten.Anteile_akt)) IS NOT NULL))

) t
ORDER BY
t.[Datum Beitrittserklärung];
Das Problem ist halt hier, das für jeden Datensatz im Ergebnis eine eigene Unterabfrage gegen die selbe Tabelle ausgeführt wird - das kostet halt Leistung.
 
Hallo dabadepdu und ukulele,
wenn ich das richtig verstehe ist das Problem, dass MS Access nicht alle SQL-Standardfunktionen unterstützt und somit eigentlich eine Fehlermeldung kommen müsste, dass die Funktion nicht zur Verfügung steht.

@ ukulele: Der Code führt genau zu dem Ergebnis, das ich benötige Vielen Dank.
1758036995096.webp
Leistung ist sicher nicht das Problem, da die Datenbank "nur" etwa 100 bis 200 Einträge haben wird.
Ich werde mir mal die Zeit nehmen den Code zu verstehen :)

Unschön ist, dass beim Übergang von der Entwurfs- oder SQL-Ansicht in die Datenblattansicht zweimal der Parameter für t.Datum_Beitrittserklärung mit leerem Inhalt bestätigt werden muss.
1758037417884.webp
Kann das irgendwie umgangen werden?

Wie gesagt: Nochmals herzlichen Dank
 
Hallo dabadepdu und ukulele,
wenn ich das richtig verstehe ist das Problem, dass MS Access nicht alle SQL-Standardfunktionen unterstützt und somit eigentlich eine Fehlermeldung kommen müsste, dass die Funktion nicht zur Verfügung steht.
Jaein. Er erkennt nicht, das es sich um eine Funktion handelt, daher unbekannte Syntax bzw. fehlerhafte Syntax und nicht unbekannte Funktion.
Unschön ist, dass beim Übergang von der Entwurfs- oder SQL-Ansicht in die Datenblattansicht zweimal der Parameter für t.Datum_Beitrittserklärung mit leerem Inhalt bestätigt werden muss.
Anhang anzeigen 2623
Kann das irgendwie umgangen werden?
Da bin ich überfragt. Ich bekomme in MSSQL keinen Syntax Fehler und funktionieren tuts ja auch ;-) Kannst du dir, nachdem du "den Parameterwert eingegeben" hast, den Code nochmal anzeigen lassen, ob MSSQL da irgendwas einträgt? Vielleicht stört er sich an dem * im Äußeren Select, das sollte man sowieso in produktivem Code später ersetzen.
 
Hallo ukulele,
in der SQL-Ansicht kommt folgendes

SELECT
(
SELECT
sum(Interessenten.Anteile_akt)
FROM
Interessenten
WHERE
Interessenten.[Datum Beitrittserklärung] <= t.Datum
) AS lfd_summe,
*
FROM
(
SELECT
Interessenten.[Datum Beitrittserklärung] AS Datum,
Sum(Interessenten.Anteile_akt) AS Anteile
FROM
Interessenten
GROUP BY
Interessenten.[Datum Beitrittserklärung]
HAVING
(((Sum(Interessenten.Anteile_akt)) IS NOT NULL))
) AS t
ORDER BY
t.[Datum Beitrittserklärung];

Irgendwie rutscht das "*," im äußeren SELECT als " ,*" hinter die lfd_summe
 
Moin,
um eine laufende Summe für die Anteile zu erzeugen, trage in einem weiteren Feld folgendes ein:

LaufendeSumme: DomSumme("Anteile_akt";"Interessenten";"idInteressent <=" & [idInteressent])

in der Annahme das es eine idInteressent in der Tabelle gibt.
Gruß
Jo
 
Du solltest außerdem * durch t.Datum und t.Anteile ersetzen, dann kommt die Abfrage vermutlich nicht mehr. Die Reihenfolge sollte sich dann auch kontrollieren lassen.
 
Wenn die Abfrage Grundlage für einen Report ist, kann man im Report neben dem Feld "Anteile_akt" ein weiteres Feld mit z.B. Name "lfdSummeAnteile" mit der Eigenschaft: Steuerelementinhalt =[Anteile_akt] setzen. Access bietet dann in den Eigenschaften des Feldes standardmäßig eine Eigenschaft "laufende Summe" an. Dort wählt man dann einfach "über alles".
 
Genau so ist es. In einem Bericht kann man die laufende Summe darstellen, in einer Abfrage glaube ich nicht.
Berichte können einen aber auch in den Wahnsinn treiben, man muss genau wissen, in welchem Teil des Berichtes man was einträgt.

MfG

Martin
 
Werbung:
Zurück
Oben