Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!

Mobiles Hauptmenü

Differenz zwischen zwei Zeilen der selben Spalte

Begonnen von burns_1987, Mai 21, 2018, 20:27:22

⏪ vorheriges - nächstes ⏩

burns_1987

Hallo liebe Forenmitglieder,

ich habe folgendes Problem und möchte mich vorweg schonmal für jegliche Hilfe bedanken!

Ich habe einen Stromzähler für eine Solaranlage und benötige eine Auswertung für den erzeugten Strom.
Der Zählerstand wird monatlich in eine Tabelle per Formular geschrieben. Jetzt benötige ich die Differenz zum Zählerstands des jeweiligen Vormonats. Wie realisiere ich das in Access?

Ich hoffe, dass ich mich verständlich ausgedrückt habe :-) Dankeschön

Beaker s.a.

Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

burns_1987

Guten Morgen und vielen Dank für die schnelle Hilfe!

Ich werde daraus leider nicht schlau - sorry!

Also, ich habe in einer Tabelle "Stromverbrauch" mit den Feldern:

- s_erzeugung (hier werden die monatlichen Zählerstände erfasst, die die Solaranlage erzeugt)

- s_einspeisung (hier werden die Zählerstände erfasst, die an den Stromversorger abgegeben werden)

- s_stromversorger (hier werden die Zählerstände des Stromversorgers angezeigt, da man Strom zukaufen muss, wenn die Solaranlage nicht produtziert)

Die Daten sind immer fortlaufend und werden nicht jeden Monat auf 0 gesetzt.

Und jetzt muss für das Feld für jeden einzelnen Zähler die Differenz gezogen werden zum jeweiligen Vormonat.

Es wäre lieb, wenn ihr mir als Access-Neuling weiterhelfen könntet.

Vielen, vielen Dank!

MzKlMu

Hallo,
die FAQ 3.11 beschreibt das genau. Was verstehst Du daran nicht ?

Wie wird der Maonat erfasst, als Datum (wie es sein sollte) oder als Monat und Jahr (jeweils Zahlen) ?
Gruß Klaus

burns_1987

Hi, danke für die Antwort, ich gucke mir das nochmal ganz in Ruhe an, aber ich verstehe das ehrlich gesagt so, als ob eine fortlaufende Nummer, wie bei der ID erzeugt wird (aber ich lese nochmal nach, wahrscheinlich ist irgendwo ein Denkfehler!)

Der Monat bzw. Tag wird jeweils im Datumsfeld mit dem 01.01. (Januar), 01.02. (Februar), etc, erfasst.

Danke nochmal.

MzKlMu

Gruß Klaus

Lachtaube

Hier ist ein DBFiddle mit Kommentaren, wo Unterschiede zu Access berücksichtigt werden müssen.
Grüße von der (⌒▽⌒)

burns_1987

Zitat von: MzKlMu am Mai 22, 2018, 10:56:48
Hallo,
hast Du den Link in der FAQ ganz unten nicht gesehen ?
Hi MzKlMu,
dankeschön, aber die habe ich bereits offen und bringt mich leider auch ncht weiter  :-[
Da steht immer, es sei ein Syntaxfehler vorhanden. Zudem ist in der Entwurfsansicht der Afrage gar kein Feld "Summe", obwohl das Summenfeld aktiviert ist. Aber ich komme gar nicht aus dem "Feld", da dort der Fehler auftaucht.

Danke euch beiden, den Link von Lachtaube schaue ich mir gleich mal an!
Dankeschön!

burns_1987

danke nochmal für den Link, aber im SQL-Code sieht es doch auch so aus, als seien die Daten fix angegeben und im zweiten Codefeld steht, dass dieses nicht für Abfagen zu verwenden ist und im dritten ist mir nicht klar, wo dieser Code reingehört.

Ich bin einfach überfordert und muss mich entschuldigen und bitte zu verstehen, dass der ein oder andere auch mal klein angefangen hat :-)

Danke und Gruß
Fabian

Lachtaube

Zuerst wird eine View (Auswahlbbfrage) mit drei fiktiven Datensätzen angelegt und angezeigt, die Dich nicht interessieren muss. Sie sollte jedoch drei Zählerstände ausgeben.

Der mittlere Bereich ist derjenige, der für Dich von Interesse sein sollte. Weil PostgreSQL eine andere Syntax für Spitzenwerte verwendet, habe ich jeweils einen Kommentar in der ersten Unterabfrage hinzugefügt, was statt dessen in Access einzusetzen ist. Bei den folgenden zwei Unterabfragen ist analog zu verfahren. Kommentare, das ist der Text beginnend mit -- muss in der SQL-Ansicht einer Access-Abfrage natürlich weggelassen werden und statt daten, wirst Du auch den richtigen Tabellennamen einsetzen müssen. Ggf. muss der Zeitraum des Ablesens noch angepasst werden (Datumsfeld?). Jede Unterabfrage fragt dieselbe Tabelle noch einmal ab und nimmt hier beispielhaft das Jahr multipliziert mit 100 plus der Monatszahl als Kriterium für die äußere Hauptabfrage und jeweils die innere Unterabfrage. Top 1, bzw. Limit 1 im Beispiel reduziert die Anzahl der Datensätze auf genau einen. Eine absteigende Sortierung sorgt dafür, dass nur der jüngste Datensatz berücksichtigt wird. Und das Kriterium bewirkt, dass die zu betrachtenden Datensätze älter als der aktuelle Datensatz sein muss. Die Werte spiegeln immer die Differenz des aktuellen zum vorherigen Datensatz wider. Für den ersten Datensatz ließe sich noch die Null durch 0 ersetzen, falls das wünschenswert ist.

Der letzte (rein informative) Abschnitt zeigt, wie man in einer Datenbank mit modernem SQL-Dialekt (Stand 2008!) das gleiche Ergebnis hervorbringen kann.

Wenn Dir die Umsetzung nicht gelingt, poste bitte in einem Code-Abschnitt (Text markieren und dann den Knopf mit der Raute # in der Antwort drücken) hier eine handvoll Datensätze (einfach aus der Tabelle kopieren) und nenne uns den Tabellennamen.
Grüße von der (⌒▽⌒)

papanetti

Hallo Lachtaube,
ich habe versucht, Deinen Code in meiner Abfrage umzusetzen, aber da kommt ein Fehler. Meine Tabelle zur Abfrage ist so aufgebaut:
ID Datum Zaehlerstand
3 01.05.2018 8378,00
4 01.06.2018 8492,00
5 01.07.2018 8607,00
6 01.08.2018 8738,00
7 01.09.2018 8849,00
8 01.10.2018 8979,00
9 01.11.2018 9132,00
10 01.12.2018 9268,00
11 01.01.2019 9430,00
12 01.02.2019 9594,00
13 01.03.2019 9730,00
14 01.04.2019 9877,00
1 01.05.2019 9997,00
2 01.07.2019 10301,00

Der Tabellenname ist TabVerbrStrom
Ich habe es so verändert:
SELECT TabVerbrStrom.Datum, TabVerbrStrom.Zaehlerstand,
       Zaehlerstand - ( select Zaehlerstand     
                       from   TabVerbrStrom as d1
                       where  d1.Datum * 100 < d0.Datum * 100
                       order  by Datum * 100 desc
                       limit  1
                     ) as Zaehlerstand_diff,
     
from   TabVerbrStrom as d0
order  by 1, 2;

Irgendwo habe ich einen Denkfehler.

Gruß Henry
Wenn man schon keine Ahnung hat - dann aber richtig!

DF6GL

Hallo,


vermutlich:


ZitatSELECT TabVerbrStrom.Datum, TabVerbrStrom.Zaehlerstand,
       Zaehlerstand - ( SELECT Top 1 Zaehlerstand     
                       FROM     TabVerbrStrom AS d1
                       WHERE  d1.Datum < d0.Datum
                       ORDER  BY Datum DESC
                       
                     ) AS Zaehlerstand_diff,
     
FROM   TabVerbrStrom AS d0
ORDER  BY 1, 2;

papanetti

Hallo,
danke für die Hilfe, aber es klemmt noch ein wenig, siehe Anhang.
MfG Henry
Wenn man schon keine Ahnung hat - dann aber richtig!

DF6GL

Hallo,

füg noch die Alias-Qualifizierer hinzu:


ZitatSELECT d0.Datum, d0.Zaehlerstand,
       d0.Zaehlerstand - ( SELECT Top 1 d1.Zaehlerstand     
                       FROM     TabVerbrStrom AS d1
                       WHERE  d1.Datum < d0.Datum
                       ORDER  BY d1.Datum DESC
                       
                     ) AS Zaehlerstand_diff,
     
FROM   TabVerbrStrom AS d0
ORDER  BY 1, 2;

papanetti

Hallo,
Danke erst einmal. Ergebniss: gleiche Fehlermeldung.

Gruß Henry
Wenn man schon keine Ahnung hat - dann aber richtig!