ich habe folgendes Problem, bei dem ich einfach nicht weiterkommen.
Ich habe eine Tabelle mit Füllständen mit folgenden Daten:
ID / Timestamp / Peilung(Füllstand)
jetzt möchte ich den Verbrauch immer zwischen 2 aufeinanderfolgenden
Datensätzen berechnen. Habe das ganze schon im Internet gesucht und es
schon mal mit folgender Abfrage versucht:
SELECT ZW.ID, ZW.Timestamp, ZW.Peilung, [Peilung]-(SELECT TOP 1
Peilung
FROM tblPeilung
WHERE
ID = ZW.ID AND
Timestamp < ZW.Timestamp
ORDER BY Timestamp DESC) AS Diff
FROM tblPeilung AS ZW
ORDER BY ZW.ID, ZW.Timestamp;
aber leider funktioniert das nicht (Fehlermeldung gibt es aber auch
keine)
Für Hilfe währe ich sehr dankbar
Viele Grüße
Andreas
PS: Win7 / Access2010 sollte aber auch unter Access 2007 lauffähig
sein
Es fehlen die Datentypen der Felder. Ich gehe der Einfachheit halber
mal von Timestamp als Zahlfeld aus. Falls es Datum/Uhrzeit ist, dann s.
http://www.donkarl.com?FAQ6.8.
Die andere Frage ist, ob ID ein eindeutiges Feld, also PK oder eindeutiger
Index, ist oder nicht. Ich gehe mal von Ja aus, obwohl dein SQL-Text da
oben nicht danach aussieht, aber sonst wird der Ausdruck so lange. ;-)
Öffne also die Abfrage in Entwurfsansicht und probiere das als Ausdruck
für ein neues berechnetes Feld (1 Zeile):
Peilung-nz(DomWert("Peilung";"ZW";"ID=" & nz(DomMax("ID";"ZW";"Timestamp=" &
Timestamp & " And ID<" & ID);0));0)
--
Servus
Karl
*********
Access-FAQ: http://www.donkarl.com +
3. .NET-Entwickler-Konferenz, 7./.8.5. Nürnberg, 21./22.5. Hannover
Danke erst einmal für deine Antwort.
Sorry, aber ich habe gedacht meine Feldnamen sind relativ eindeutig,
deshalb habe ich mal auf weitere Ausführungen verzichtet. es ist
leider ein wenig anders als wie von dir angenommen:
ID = PrimaryKey / autowert
Timestamp = Datumsfeld, in das standardmäßig now() eingetragen wird
Peilung = LonInteger mit den Füllständen
ich habe mal deinen Ansatz mit den D-Funktionen angepasst, aber leider
bekomme ich immer nur Fehlermeldungen:
SELECT tblPeilung.ID, tblPeilung.Timestamp, tblPeilung.Peilung,
[Peilung]-Nz(DLookUp("[Peilung]","tblPeilung","[ID] = " &
DMax("[ID]","tblPeilung","[ID] = " & [ID] & " AND " &
BuildCriteria("[Timestamp]",8,"<" & [Timestamp]))),0) AS Diff
FROM tblPeilung;
Fehlermeldung - #Error
Für Weitere Hilfe bin ich nach wie vor sehr dankbar, denn ich weiß
irgend wie nicht mehr weiter
viele Grüße
Andreas
On 1 Apr., 10:28, "Karl Donaubauer" <NoS...@donkarl.com> wrote:
> Andreas Gauer wrote:
> > ...
> > Ich habe eine Tabelle mit Füllständen mit folgenden Daten:
>
> > ID / Timestamp / Peilung(Füllstand)
>
> > jetzt möchte ich den Verbrauch immer zwischen 2 aufeinanderfolgenden
> > Datensätzen berechnen. Habe das ganze schon im Internet gesucht und es
> > schon mal mit folgender Abfrage versucht:
>
> > SELECT ZW.ID, ZW.Timestamp, ZW.Peilung, [Peilung]-(SELECT TOP 1
> > Peilung
> > FROM tblPeilung
> > WHERE
> > ID = ZW.ID AND
> > Timestamp < ZW.Timestamp
> > ORDER BY Timestamp DESC) AS Diff
> > FROM tblPeilung AS ZW
> > ORDER BY ZW.ID, ZW.Timestamp;
>
> > aber leider funktioniert das nicht (Fehlermeldung gibt es aber auch
> > keine)
> > ...
>
> Es fehlen die Datentypen der Felder. Ich gehe der Einfachheit halber
> mal von Timestamp als Zahlfeld aus. Falls es Datum/Uhrzeit ist, dann s.http://www.donkarl.com?FAQ6.8.
>
> Die andere Frage ist, ob ID ein eindeutiges Feld, also PK oder eindeutiger
> Index, ist oder nicht. Ich gehe mal von Ja aus, obwohl dein SQL-Text da
> oben nicht danach aussieht, aber sonst wird der Ausdruck so lange. ;-)
>
> Öffne also die Abfrage in Entwurfsansicht und probiere das als Ausdruck
> für ein neues berechnetes Feld (1 Zeile):
>
> Peilung-nz(DomWert("Peilung";"ZW";"ID=" & nz(DomMax("ID";"ZW";"Timestamp=" &
> Timestamp & " And ID<" & ID);0));0)
>
> --
> Servus
> Karl
> *********
> Access-FAQ:http://www.donkarl.com+
> 3. .NET-Entwickler-Konferenz, 7./.8.5. Nürnberg, 21./22.5. Hannover- Zitierten Text ausblenden -
>
> - Zitierten Text anzeigen -
habe meinen Fehler gefunden. Das Problem war, dass ich die
fortlaufenden ID mit gesucht habe im Dmax. Das kann ja nichts
werden :-)
nachdem ich die ID aus der Bedingung entfernt habe ging es, aber auch
mit meiner SQL-Lösung
Danke noch mal
Gruß
Andreas
> > - Zitierten Text anzeigen -- Zitierten Text ausblenden -
Andreas Gauer wrote:
> ID = PrimaryKey / autowert
> Timestamp = Datumsfeld, in das standardmäßig now() eingetragen wird
> Peilung = LonInteger mit den Füllständen
>
> ich habe mal deinen Ansatz mit den D-Funktionen angepasst, aber leider
> bekomme ich immer nur Fehlermeldungen:
>
> SELECT tblPeilung.ID, tblPeilung.Timestamp, tblPeilung.Peilung,
> [Peilung]-Nz(DLookUp("[Peilung]","tblPeilung","[ID] = " &
> DMax("[ID]","tblPeilung","[ID] = " & [ID] & " AND " &
> BuildCriteria("[Timestamp]",8,"<" & [Timestamp]))),0) AS Diff
> FROM tblPeilung;
Probier mal so:
SELECT tblPeilung.ID, tblPeilung.Timestamp, tblPeilung.Peilung,
[Peilung]- Nz(DLookUp("[Peilung]","tblPeilung","Timestamp = " &
DMax("[Timestamp]","tblPeilung","[Timestamp]<" & [Timestamp])),0) AS Diff
FROM tblPeilung;
(Luftcode)
Gruss - Peter
--
Mitglied im http://www.dbdev.org
FAQ: http://www.donkarl.com
Wenn ID der PK ist, kann dein DMax-Ausdruck keine Ergebnisse
bringen, denn er sucht nach der identen ID bei kleinerem Timestamp.
Also lass dort den ID-Vergleich weg:
SELECT tblPeilung.ID, tblPeilung.Timestamp, tblPeilung.Peilung,
[Peilung]-Nz(DLookUp("[Peilung]","tblPeilung","[ID] = " &
DMax("[ID]","tblPeilung", BuildCriteria("[Timestamp]",8,"<" &
[Timestamp]))),0) AS Diff FROM tblPeilung
--
(Hat sich mit meiner Antwort überschnitten.)
Deshalb ja meine ursprüngliche Anmerkung, dass ID in deinem
SQL-Text nicht nach einem PK aussieht. ;-)
> nachdem ich die ID aus der Bedingung entfernt habe ging es, aber auch
> mit meiner SQL-Lösung
Die D-Funktionen sind oft schneller als Unterabfragen.
Wenn du viele DS hast, dann mache einen Performance-Vergleich.
Hallo Andreas,
> ID / Timestamp / Peilung(Füllstand)
>
> jetzt möchte ich den Verbrauch immer zwischen 2 aufeinanderfolgenden
> Datensätzen berechnen. Habe das ganze schon im Internet gesucht und es
> schon mal mit folgender Abfrage versucht:
...
ich stehe auch immer wieder vor ähnlich gelagerten Problemen udn
verwende den Weg, eine Abfrage auf die gesuchten Werte zu machen und
diese mit sich selbst in Bezug zu setzen:
Bsp:
SELECT a.KW, a.Anzahl_kw, a.Anzahl AS WW, a.Jahr
FROM (SELECT l.KW_ISO, l.KW, l.Jahr, l.Anzahl AS Anzahl_kw,
Sum(r.Anzahl) AS Anzahl FROM qry_prodzahl_KW_OM651_piezo AS l LEFT JOIN
qry_prodzahl_KW_OM651_piezo AS r ON l.KW_ISO>=r.KW_ISO GROUP BY
l.KW_ISO, l.KW, l.Jahr, l.Anzahl) AS a
ORDER BY a.Jahr, a.KW;
Liefert ein Running Total an Vorkommen, sowie die Differenz zum Vorgänger
Das ganze benötigt keinen PK sondern lediglich einen eindeutigen
Schlüssel in der Unterabfrage für den Selbstbezug. Und sie muss in sich
nach diesem Schlüssel sortiert sein.
Rauskommen tut da oben.
Kalenderwoche(KW), Jahr(Jahr), Differenz zur VorWoche(Anzahl_kw),
kummulierte Summe(Anzahl) bis heute.
Beachte, was dabei aus welcher der beiden Unterabfragen stammt.
Läuft unter Access 2002, 2003, 2007 (Datenbank auf SQL-Ansi92 Modus
gesetzt evtl ist das aber gar nicht nötig dafür)
Früher hies es immer wieder (und auch noch viele Access-Bücher behaupten
das), dass die D-Funktionen Ressourcen fressend seien, deswegen habe ich
diese Lösung da oben verwendet.
Das Join da oben ist relativ schnell, langsam sind bei mir die darunter
liegendenen Queries. (Testlaufzeit: 9 Sek für innen liegende Querie; für
das gesamte Statement 14 Sekunden)
Aber dazu kann Karl sicher wesentlich mehr sagen.
> PS: Win7 / Access2010 sollte aber auch unter Access 2007 lauffähig
> sein
>
Grüsse aus dem sonnigen Süden.
Alex.