Berechnete Spalte in einer Tabelle

Moderator: ModerationP

Berechnete Spalte in einer Tabelle

Beitragvon BadaPing » 02. Sep 2021, 13:49

Hallo zusammen,

ich habe eine Frage zu berechneten Spalten in einer Tabelle.

Aufgrund der zahlreichen hilfreichen Rückmeldungen in folgendem Thema (Link: http://www.office-loesung.de/p/viewtopic.php?f=167&t=869326) habe ich den Aufbau meiner Datenbank korrigiert. Die neue Frage hat sich aus meiner Sicht zu weit von dem dort ursprünglich aufgerufenen Thema entfernt, so dass ich hier einen neuen Beitrag erstellt habe.

Die Datenbank ist wie folgt aufgebaut: http://www.office-loesung.de/p/download/file.php?id=122251

Ich möchte nun in einer Spalte die Veränderung zum Vor-Stichtag für den jeweiligen Wert berechnen. Ich kann jedoch nicht einfach die vorherige Zeile für die Berechnung heranziehen, da die Daten wie folgt vorliegen:

Stichtag 1; Abteilung 1; Kenngröße 1; Wert
Stichtag 1; Abteilung 1; Kenngröße 2; Wert
Stichtag 1; Abteilung 2; Kenngröße 1; Wert
Stichtag 1; Abteilung 2; Kenngröße 2; Wert
Stichtag 2; Abteilung 1; Kenngröße 1; Wert
usw.

Hat jemand eine Idee, wie ich die berechnete Spalte ausgestalten muss, damit immer die korrekte Zeile zur Berechnung der Differenz zum Vor-Stichtag gewählt wird?

Vielen Dank im Voraus
Frederick
BadaPing
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 11
Registriert: 31. Aug 2021, 17:06

Re: Berechnete Spalte in einer Tabelle

Beitragvon DerHoepp » 02. Sep 2021, 14:29

Moin,

grundsätzlich gehören berechnete Felder gar nicht in die Tabelle sondern in eine Abfrage. Welchen Datentyp hat denn Stichtag? Und welcher Wert soll für den ersten Stichtag berechnet werden?

Viele Grüße
derHöpp
DerHoepp
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 9727
Registriert: 14. Mai 2013, 11:08

Re: Berechnete Spalte in einer Tabelle

Beitragvon BadaPing » 02. Sep 2021, 14:39

Hi!
Der Stichtag hat das Format DD.MM.YYYY. Ich möchte jeweils die prozentuale Veränderung zum vorherigen Stichtag berechnen. Da ich später Berichte generiere, die diese prozentuale Veränderung im Zeitverlauf darstellen, möchte ich den Wert auch als Spalte in der Tabelle enthalten haben. Grundsätzlich gibt es ja bei Access die Möglichkeit eine Berechnung bereits in der Tabelle durchzuführen.

Viele Grüße
Frederick
BadaPing
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 11
Registriert: 31. Aug 2021, 17:06

Re: Berechnete Spalte in einer Tabelle

Beitragvon Bitsqueezer » 02. Sep 2021, 16:26

Hallo,

berechnete Felder können normalerweise nicht auf andere als den aktuellen Datensatz zugreifen. In SQL Server kann man eine Function basteln, die dann komplexer sein kann und diese in einer berechneten Spalte verwenden. In Access gibt es nur Makros und für Datenmakros kann man meines Wissens keine VBA-Function aufrufen. Habe ich aber noch nie probiert, weil Makros für mich ein No-Go sind.

Du kannst hier aber in der Tat einfach eine Abfrage verwenden, die Du dann für die Berichte als Grundlage für die jeweilige Berichtsabfrage verwendest. Dann hast Du auch nur einen Punkt, an dem Du die Berechnung ggf. anpassen kannst. In einer Abfrage kannst Du natürlich auch VBA-Functions aufrufen, aber besser den Job per SQL erledigen. Der vorhergehende Datensatz kann mit einer Unterabfrage ermittelt werden. Das Kriterium, um zu sagen, "das ist der vorhergehende" hängt von Deinen Daten ab. Z.B. ein Datum/Uhrzeit-Feld oder eine ID oder was auch immer.

Gruß

Christian
Bitsqueezer
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 8468
Registriert: 21. Jun 2007, 12:17

Re: Berechnete Spalte in einer Tabelle

Beitragvon BadaPing » 03. Sep 2021, 06:12

Hi Christian,

vielen Dank für die Rückmeldung! Wäre es möglich das ganze über eine Anfügeabfrage zu lösen, in dem ich den Wert des Vor-Stichtags ergänze? Dann hätte ich die passenden Daten jeweils in einer Zeile und könnte dort das Feld berechnen.

Ich habe die Felder Stichtag (Datum, DD.MM.YYYY), AbteilungID (Zahl), MessgrößeID (Zahl) und Wert (Zahl). Und würde dann noch eine Spalte "Wert-Vorstichtag" (Zahl) ergänzen. Mit folgendem SQL bekomme ich den vorherigen Wert:
Code: Alles auswählen
SELECT TOP 1 Wert
FROM (SELECT TOP 2 Wert, Stichtag FROM tblStichtage WHERE AbteilungID=1 AND MessgrößeID=1 ORDER BY Stichtag DESC)
ORDER BY Stichtag;


Allerdings nur von der festgelegten AbteilungID und MessgrößeID. Hat jemand eine Idee wie ich das in ein INSERT INTO umwandle, bei dem AbteilungID und MessgrößeID abgeglichen werden, und die Abfrage nur Felder betrachtet die Leer sind?

Viele Grüße
Frederick

Moderatorenanmerkung:
Bitte das Zitieren vollständiger Beiträge unterlassen KlausMz
BadaPing
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 11
Registriert: 31. Aug 2021, 17:06

Re: Berechnete Spalte in einer Tabelle

Beitragvon Bitsqueezer » 03. Sep 2021, 09:17

Hallo,

sicher ist das möglich, macht aber nicht wirklich Sinn, zumal Du ja bereits einen SELECT gebildet hast, der Dir die Zeile davor ausgibt. Das einfach in eine Abfrage und Du hast, was Du brauchst, ganz ohne Zusatzfeld und ohne INSERT (wobei es dann auch einen UPDATE brauchen würde...).

Gruß

Christian
Bitsqueezer
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 8468
Registriert: 21. Jun 2007, 12:17

Re: Berechnete Spalte in einer Tabelle

Beitragvon BadaPing » 03. Sep 2021, 09:37

Hi Christian,

Vielen Dank für deine Antwort. Ich sehe noch nicht ganz, warum das keinen Sinn macht. Wie gesagt, möchte ich die Daten dauerhaft in der Tabelle speichern, damit ich später in einem Bericht auf diese Spalte zurückgreifen kann.

Darüber hinaus ist in meiner Abfrage die AbteilungID und die MessgrößeID fix. Müsste aber variabel sein, d.h. es müsste die Info immer aus der aktuellen Zeile abgreifen. Hast du hierfür ein Beispiel, wie das aussehen müsste?

Viele Grüße
Frederick
BadaPing
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 11
Registriert: 31. Aug 2021, 17:06

Re: Berechnete Spalte in einer Tabelle

Beitragvon Bitsqueezer » 03. Sep 2021, 09:53

Hallo,

ein Bericht verwendet für gewöhnlich eine Abfrage, also kannst Du das ganze doch in einer Abfrage formulieren und die berechnete Spalte wird live berechnet, wo ist das Problem?

Und natürlich kannst Du nicht einfach "=1" verwenden. Du machst einen JOIN auf die gleiche Tabelle. Wenn man sich dabei angewöhnt, auch immer Tabellenaliase und qualifizierte Felder zu verwenden (also Feldnamen mit vorangestelltem Tabellenalias, zu dem das Feld gehört), kann man auch problemlos genau bestimmen, welches Feld zu welcher Tabelle gehört, ganz besonders, wenn man einen JOIN auf die gleiche Tabelle macht.

Du mußt halt nur ein Kriterium haben, das eindeutig ist, also AbteilungID, MessgrößeID und Stichtag zusammen darf es nicht zweimal geben.

Gruß

Christian
Bitsqueezer
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 8468
Registriert: 21. Jun 2007, 12:17

Re: Berechnete Spalte in einer Tabelle

Beitragvon BadaPing » 03. Sep 2021, 11:04

Hi Christian,

Danke für deine Rückmeldung! Ich verstehe grundsätzlich was du meinst, mir fehlt allerdings noch die Vorstellung, wie das konkret in SQL aussieht.
Wenn ich mir bspw. einen Bericht generieren möchte, der mir die Abteilungen anzeigt, bei denen sich Messgröße 1 um mehr als 5% verändert hat.

Den Wert der Vorwoche lasse ich mir ja wie folgt ausgeben:
Code: Alles auswählen
SELECT TOP 1 tblStichtag.Wert
FROM (SELECT TOP 2 tblStichtag.Wert, tblStichtag.Stichtag FROM tblStichtage WHERE tblStichtag.MessgrößeID=1 ORDER BY tblStichtag.Stichtag DESC)
ORDER BY tblStichtag.Stichtag;


Die MessgrößeID von 1 wäre ja korrekt, weil ich es mir nur für diese Messgröße anzeigen möchte.

Wie berechne ich jetzt in SQL (I) die Veränderung zum aktuellen Stichtag für alle Abteilungen, (II) Filter die Ergebnisse aus, deren Veränderung unter 5% liegt und (III) zeige mir nur die Abteilungen an bei denen das so ist?

Viele Grüße
Frederick
BadaPing
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 11
Registriert: 31. Aug 2021, 17:06

Re: Berechnete Spalte in einer Tabelle

Beitragvon Bitsqueezer » 03. Sep 2021, 12:28

Hallo,

"Zugriff auf vorherige Zeile" ist ein Standardproblem, Beispiele:

https://stackoverflow.com/questions/577 ... ious-month
https://stackoverflow.com/questions/503 ... -not-dates

Und etliche mehr.

Das ist die Basisabfrage, die Du erstellst, die Du dann für viele Zwecke verwenden kannst.

Und Deine Reportabrage greift dann nicht auf die Tabelle, sondern diese Abfrage zu, die das berechnete Feld enthält. Und auf dieses dann ein entsprechendes WHERE anzuwenden, sollte ja kein Kunststück sein.

Gruß

Christian
Bitsqueezer
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 8468
Registriert: 21. Jun 2007, 12:17


Zurück zu Access Forum (provisorisch)

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 18 Gäste