etnobommel1989
Goto Top

Access, subtrahieren zweier Datensätze

Tabelle Umsatz mit einer Spalte Wert

Hey Leute,

in Excel ist so etwas ganz einfach zu lösen, da rechne ich einfach z.B. A3-A2 und ziehe dies einfach runter, so dass dann A4-A3 usw. kommt.

Wie kann ich das in Access bewältigen?? SQL??

Danke

Content-ID: 160679

Url: https://administrator.de/contentid/160679

Ausgedruckt am: 22.11.2024 um 17:11 Uhr

NetWolf
NetWolf 13.02.2011 um 20:18:08 Uhr
Goto Top
Moin Moin,

so schwer es fällt, vergiss Excel.

Tabellen sind in Access ausschließlich dafür da, Daten zu speichern.
Auswertungen, Bearbeiten und Anzeigen werden über Formulare und Berichte gemacht.

Berechnungen kann man sowohl in Formularen und Berichten durchführen, als auch Abfragen (SQL) dafür nutzen.

Die Frage ist also: was willst du als Ergebnis erreichen?


Grüße aus Rostock
Wolfgang
(Netwolf)
etnobommel1989
etnobommel1989 14.02.2011 um 07:43:21 Uhr
Goto Top
Ähhm ich will, wie oben beschrieben eine Abfrage gestalten, wo die Spalte der Tabelle Umsatz drin vorkommt.

Also:

SELECT Wert
FROM Umsatz;

und daneben möchte ich die Differenz, der beiden Datensätze



Also ich will in der Abfrage die Spalte Differenz noch bilden.
Biber
Biber 14.02.2011 um 09:43:40 Uhr
Goto Top
Moin etnobommel1989,

ich bin nicht sicher, ob es sich wirklich noch lohnt, solche Kunststückchen für "Wetten dass.." einzuüben -
angeblich will sich der Thomas "ForEverYoung" Gottschalk doch ganzjährig zum Winterschlaf in seine Schweineschwarten-Goldbärenhöhle zurückziehen.

Ich hatte dir doch neulich in einem ähnlichen Beitrag geschrieben, dass die physikalische Reihenfolge von Datensätzen in einer Datenbanktabelle vollkommen willkürlich und zufällig ist.
Eine Abfrage "SELECT wert FROM Umsatz" allerdings ist nicht nur unter Datenbankgesichtspunkten albern.

Ein "Umsatz" hängt doch nicht frei schwebend im Raum, sondern beschreibt doch so etwas wie "Preis*Stückzahl" bezogen auf einen oder mehrere Artikel.
Und vor allem auf einen Zeitraum (Tag oder Monat oder Quartal) bezogen.

Du kannst doch unmöglich nur Tabellen haben, die aus einer Autowert-Spalte und einem Nutzfeld bestehen.
Und doch nicht nur Fragestellungen, die sich auf Vorgänger-Nachfolger-beziehungen beziehen.

Dafür ist doch eine Datenbank nur geeignet, wenn du auch Vorgänger und Nachfolger/Parent und Child logisch verkettest.
Einfach nur alle Daten in eine lange lange Reihe kippen und dann Umsatzdifferenzen bilden - das mag ein Plan sein, aber er könnte noch verfeinert werden.

Wie sieht den jetzt die "Umsatz"-Tabelle wirklich aus - vor allem, was ist der identifizierende Schlüssel und/oder die Sortierreihenfolge?

Grüße
Biber
etnobommel1989
etnobommel1989 14.02.2011 um 09:55:22 Uhr
Goto Top
Es ist in Wirklichkeit eine andere Tabelle, ich will es nur zur Veranschaulichung und als Beispiel, nur will ich hier nicht meine reelen Tabellen posten, wie gesagt es geht mir hierbei nur ums Prinzip, den vorherigen Datensatz zu subtrahieren, ob das machbar ist oder nicht, zudem ginge dies beim ersten Datensatz ja nicht weil davor noch kein Datensatz vorhanden ist, also müsste er beim zweiten Datensaetz anfangen und den ersten Datensatz subtrahieren und das Ergebnis daneben in einer weiteren Spalte , nennen wir sie "Differenz" ausgeben.

Geht sowas in Access überhaupt? Wenn ja wäre nett wenn mir einer verrät wie??

Ich zähl auf dich Biber!!!

Gruß Marcus
Biber
Biber 14.02.2011 um 10:05:45 Uhr
Goto Top
Moin etnobommel1989,

nochmal...
zudem ginge dies beim ersten Datensatz ja nicht weil davor noch kein Datensatz vorhanden ist,
also müsste er beim zweiten Datensaetz anfangen und den ersten Datensatz subtrahieren

Es gibt in Datentabellen keinen "ersten" und keinen "zweiten" Datensatz.
Du bist gedanklich noch in Excel... da kannst du automatisch eine Zeile eingeben und der Cursor springt in die nächste Zeile.
Und ganz links steht dort eine Zeilennummer 1, 2, 3, ...viele.

Jetzt sind wir bei Datenbanktabellen. Da kannst du nicht sagen "Ziehe Wert von Satz 16 vom Wert von Satz 15 ab".

Wenn du die Struktur deiner "umsatz"-Tabelle nicht preisgeben kannst wegen dieser ganzen Designpiraten, die das abkupfern, dann gib uns eine Tablle "Fritz" oder "Heinz". Aber bitte mit der Info (wie oben schon gebettelt)
...was ist der identifizierende Schlüssel und/oder die Sortierreihenfolge?

Grüße
Biber
etnobommel1989
etnobommel1989 14.02.2011 um 10:13:16 Uhr
Goto Top
777af269c331219dfa17b7ed24316803


Es ist alles aufsteigend nach Runde sortiert


Die Tabelle heißt Dutzend
Biber
Biber 14.02.2011 um 10:49:34 Uhr
Goto Top
Moin etnobommel1989,

SELECT a.Runde, a.Dutzend, 
          a.Runde-(select max(Runde) from etno where Runde < a.runde) as Differenz
FROM etno a;

Grüße
Biber
etnobommel1989
etnobommel1989 14.02.2011 um 11:00:59 Uhr
Goto Top
Passt alles so soll es aussehen, nur Leider ist die Spalte Differenz leer.
Biber
Biber 14.02.2011 um 11:10:52 Uhr
Goto Top
Tja,

bei mir sieht es so aus:
Runde	Dutzend	Differenz
1	L	
3	L	2
7	L	4
8	L	1
13	L	5
16	L	3
17	L	1
25	L	8
26	L	1
29	L	3
30	L	1
38	L	8

Grüße
Biber
etnobommel1989
etnobommel1989 14.02.2011 um 11:16:08 Uhr
Goto Top
a ist ja in meinem Falle Dutzend, weil die Tabelle Dutzend heißt und was soll das "FROM etno a"
Biber
Biber 14.02.2011 um 11:30:02 Uhr
Goto Top
moin etnobommel1989,

a ist ja in meinem Falle Dutzend, weil die Tabelle Dutzend heißt und was soll das "FROM etno a"
Dann bitte ersetze überall in meinem Statement den Tabellennamen "etno" durch "Dutzend".

Grüße
Biber
etnobommel1989
etnobommel1989 14.02.2011 um 11:37:51 Uhr
Goto Top
Aus diesem a am Ende macht dann Access automatisch ein "AS a" und wenn ich die Abfrage jetzt öffne kommt gar nix mehr, also die Abfrage lässt sich nicht öffnen, kann das daran liegen, dass Dutzend keine Tabelle sonder auch schon eine Abfrage ist, müsste doch aber troztdem genau so gehen, oder??
Biber
Biber 14.02.2011 um 12:18:04 Uhr
Goto Top
Moin etnobommel1989,

wenn dieses Access meint, statt "...FROM dutzend a" besser "...FROM dutzend AS a" schreiben zu müssen...
Derlei konstruktive Verbesserungen habe ich schon damals bei meiner Ex-Schwiegermutti geliebt.

Und ja, natürlich darfst du auch auf eine Abfrage statt auf eine Tabelle zugreifen und nochmals ja, du darfst deine Abfragen auch "Dutzend" nennen,
wenn das dem Dokumentationsanspruch deines Cheffes genügt.

Also - statt Tabelle "Umsatz" mit Spalte "Wert" haben wir jetzt eine Abfrage "Dutzend" mit zwei Spalten "Runde" und "Dutzend" ..
Noch irgendwelche Details, die relevant sein könnten?

Grüße
Biber
etnobommel1989
etnobommel1989 14.02.2011 um 12:25:29 Uhr
Goto Top
SELECT a.Runde, a.Dutzend, a.Runde-(select max(Runde) from Dutzend_1 where Runde < a.runde) AS Differenz
FROM Dutzend_1 INNER JOIN Dutzend_1 AS a ON [Dutzend_1].[Runde]=a.Runde;

so geht es


Danke für alle tipps
wiesi200
wiesi200 14.02.2011 um 12:42:15 Uhr
Goto Top
Hallo,

nur so als kleine Randanmerkung. Microsoft nutzt an einer Stelle fast genau die gleich Berechnung.

http://de.wikipedia.org/wiki/Microsoft_Dynamics_NAV

im Punkt: SIFT Technologie
Biber
Biber 14.02.2011 um 13:01:41 Uhr
Goto Top
Moin wiesi200,

weitere Parallele: die Redmonder Nachwuchstalente halten ebenfalls einen INNER JOIN auf sich selbst für übertrieben.

@etnobommel1989
Stimmt es denn, dass sich die SQL-Formulierung
SELECT ... ...FROM Dutzend_1 INNER JOIN Dutzend_1 AS a ON [Dutzend_1].[Runde]=a.Runde
.. übersetzen liesse mit "Hole mir ... aus Tabelle Dutzend_1, aber nur die Sätze, die auch in dieser Tabelle vorhanden sind"?

Egal, Haken is' dran...

Grüße
Biber
etnobommel1989
etnobommel1989 14.02.2011 um 14:50:08 Uhr
Goto Top
Mich würde trotzdem mal interressieren wie des bei dir ohne den inner join geklappt hat, access erkennt des doch gar net wenn man schreibt "FROM Dutzend a"
Biber
Biber 14.02.2011 um 15:20:01 Uhr
Goto Top
Wieso erkennt access das nicht?

Wenn ich auf einen oder beide Aliasnamen verzichten würde, dann wären öfters mal einzelne Spalten (insbesondere "Differenz") leer.
Weil Access dann z.b. das Feld "Runde" aus der falschen (logischen) Tabelle holt.

Die einzige Schreibweise, mit der ich unterstellen kann, dass
a) ich weiss, welche Felder ich miteinander vergleichen will und
b) auch Access weiss, welche Felder ich meine
..ist doch JEDES irgendwo angegebene Anzeige- oder Vergleichsfeld mit einem Alias anzusprechen.

Unmissverständlich auch für den Access-Parser/die Access-Parserin:
SELECT a.Runde, a.Dutzend, a.Runde-(select max(x.Runde)  from dutzend_1 x where x.Runde < a.runde) AS Differenz
FROM dutzend_1 a;
vollkommen gleichbedeutend mit
SELECT a.Runde, a.Dutzend, a.Runde-(select max(x.Runde)  from dutzend_1 AS x where x.Runde < a.runde) AS Differenz
FROM dutzend_1 AS a;

Und minimal (aber eben möglicherweise missverständlich) wäre für eine der beiden logischen Tabellen "Dutzend_1" ein Alias erforderlich.

Was macht denn eigentlich der Parallelthread mit dem Münzen-aufn-Kopp-hau-Problem? Auch erledigt?

Grüße
Biber
ralfol
ralfol 14.02.2011 um 23:04:34 Uhr
Goto Top
Hallo,
ich würde es mit VBA machen.

Beispl. Tab oder Abfrage zum selectieren.
Tabelle Test -> Felder Wert + ergeb

ohne SQL und mit jeder möglichen aritmetik.

Beispiel code:

Sub add_altwert()

Dim Altwert As Long
Dim db As Database, wertTab As Recordset
Set db = CurrentDb
Set wertTab = db.OpenRecordset("Test", dbOpenDynaset)
With wertTab
.MoveFirst
Altwert = ![wert]
.MoveNext
Do Until .EOF
.Edit
![ergeb] = ![wert] + Altwert
.Update
Altwert = ![wert]
.MoveNext
Loop
.Close
End With
End Sub
THEFRUST
THEFRUST 29.01.2019 um 00:06:27 Uhr
Goto Top
Hallo Biber,

ich bin ein Neuling und habe das gleiche Problem. Nachdem ich nun Stunden versucht habe, den o.g. Code umzusetzen komme ich nicht weiter.
Wäre es möglich, mir die o.g. SQL-Anweisung für meine Anforderung umzuschreiben ?

Meine Parameter:
Tabelle: Tourenzettel
Abfrage: KM_PRUEFUNG
1. Spalte = KM_ANFANG
2. Spalte = KM_ENDE
3. Spalte = Differenz KM_ENDE - KM_ANFANG

Ergebnis soll sein, über eine Abfrage KM_Ende (1. Satz) mit KM_Anfang (2.Satz) zu vergleichen .. es sollte NULL sein. Etwaige Abweichung sollten somit erkennbar sein.

Das würde mir wirklich helfen. Vielen Dank im Voraus und Grüße aus Wilhelmshaven
Andreas