Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!

Mobiles Hauptmenü

Berechnung innerhalb einer Abfrage

Begonnen von jonas84, Juni 07, 2014, 16:31:09

⏪ vorheriges - nächstes ⏩

jonas84

Hallo zusammen,

ist es möglich mit einer Abfrage in Access (bzw direkt in SQL) verschiedene (beliebig auszuwählende) Werte eine Spalte mit einander zu verrechnen? z.B. (A+B)/C
Die Werte für die Berechnungen sind über Filterkriterien oder IDs eindeutig identifizierbar.

Falls das nicht möglich ist, wie realisiere ich sowas am besten? VBA?

Danke und Gruß
Jonas

DF6GL

Hallo,

Verstehe nicht den Zusammenhang der Berechnung(en)

wenn es sich bei "A", "B" und "C" und Felder (Spalten) einer Tabelle handelt,  so kann die Formel direkt in einer Abfragespalte eingesetzt werden wobei immer jeweils die Daten aus einem Datensatz berücksichtigt werden:

Select a, b, c , (a+b)/c  as Ergebnis from tblTabelle


Müssen die Werte für EINE Berechnung aus verschiedenen Datensätzen und/oder Tabellen zusammengesammelt werden, dann könnte in der berechneten Abfragespalte die Dlookup-Funktion als "Lieferant" der einzelnen Werte benutzt werden. (Dies wiederum könnte alternativ in eine Public-Funktion ausgelagert werden, die wiederum als solche in der berechneten Abfragespalte aufgerufen wird.)
Viele Grüße vom Bodensee
Franz, DF6GL

Hilfestellung:  http://www.access-o-mania.de/forum/index.php?topic=6969.msg118738#msg118738

Links und Tipps:
1.   http://v.hdm-stuttgart.de/~riekert/lehre/db-kelz/
1a. http://www.tinohempel.de/info/info/datenbank/normalisierung.htm
1b. https://support.office.com/de-de/article/Grundlagen-des-Datenbankentwurfs-eb2159cf-1e30-401a-8084-bd4f9c9ca1f5#bmterms
2.   http://www.donkarl.com
3.   https://web.archive.org/web/20201201233522/http://www.dbwiki.net/
4.   http://www.access-tutorial.de/
5.   http://www.tty1.net/smart-questions_de.htm
6.   http://access.joposol.com/accept

Last but not least:   < F1 > für Hilfe
;) Learning by doing not by spoon-feed ;)

Tipp: Find and Replace for Access

jonas84

#2
Danke für die schnelle Antwort!

Die Zahlen sollen aus verschiedenen Datensätzen kommen.
Beispielsweise:





KennzahlWert
Umsatz100
Ausgaben80

Jetzt möchte ich mit einer Abfrage den Gewinn berechnen (Umsatz-Ausgaben). In anderen Fällen kann es auch mal eine Multiplikation oder Division sein. Das ist dann ein Fall für Dlookup?

Die Dlookup Funktion schaue ich mir auf jeden Fall mal an.

Update: Man merkt, ich bin Anfänger  :-[ Ich versuche vielleicht kurz die Datenbankstruktur bzw. das Ziel zu erklären. Vielleicht ist mein aktuelles Modell ja schon völliger Blödsinn.
Ich möchte Kennzahlen verschiedener Unternehmen über mehrere Jahre ablegen. Aktuell sieht es so aus:






UnternehmenKennzahlJahrWert
ALDIUmsatz2013100
ALDIUmsatz2014110
LIDLAusgaben2013500

Für jedes Unternehmen gibt es natürlich einen Wert für jede Kennzahl und jedes Jahr (der Einfachheit halber hier nur drei Datensätze beispielhaft).
Teile ich das dann besser in mehrere Tabellen auf? Oder nehme ich die Kennzahlen (ca. 200 Stück) als Datenfelder?
Ziel ist es, sich sowohl die Zahlen für ein Unternehmen ausgeben zu lassen, als auch Vergleiche über mehrere Unternehmen/Jahre durchzuführen.

Danke nochmal und viele Grüße
Jonas

DF6GL

Hallo,
mit der Beispieltabelle kannst Du alle angeführten Berechnungen durchführen.. Allerdings sollte die Tabelle normalisiert werden, d. h. die Firmen und die "Kennzahlen" (sind eigentlich "KennzahlTypen") sollten  in eigene Tabellen hinterlegt  und dabei nur die Primärschlüssel(werte) in der Kennzahlen-Tabelle geführt werden ( Normalisierung).

Um z. B. die Summe der Umsätze der Firma "Aldi" in den Jahren 2013 und 2014 zu erhalten, könnte die Dsum-Funktion so lauten:

Dsum("Wert";"tblKennzahlen";"Unternehmen ='Aldi' and [Jahr] in (2013,2014)")
Viele Grüße vom Bodensee
Franz, DF6GL

Hilfestellung:  http://www.access-o-mania.de/forum/index.php?topic=6969.msg118738#msg118738

Links und Tipps:
1.   http://v.hdm-stuttgart.de/~riekert/lehre/db-kelz/
1a. http://www.tinohempel.de/info/info/datenbank/normalisierung.htm
1b. https://support.office.com/de-de/article/Grundlagen-des-Datenbankentwurfs-eb2159cf-1e30-401a-8084-bd4f9c9ca1f5#bmterms
2.   http://www.donkarl.com
3.   https://web.archive.org/web/20201201233522/http://www.dbwiki.net/
4.   http://www.access-tutorial.de/
5.   http://www.tty1.net/smart-questions_de.htm
6.   http://access.joposol.com/accept

Last but not least:   < F1 > für Hilfe
;) Learning by doing not by spoon-feed ;)

Tipp: Find and Replace for Access

jonas84

Normalisiert habe ich bereits. Wie Du beschrieben hast, eine separate Tabelle für die Unternehmen und eine für die Kennzahlen. Wollte es initial eigentlich bei einer "einfachen" Frage belassen  :P

Jetzt bin ich aber wieder verunsichert, was mein Modell angeht. Was macht mehr Sinn? Nur die Felder "UnternehmensID", "KennzahlID", "Jahr" und "Wert"
oder
"UnternehmensID", "Jahr",  "Umsatz", "Ausgaben", "Anzahl Mitarbeiter" etc...

Dein Beispiel habe ich ähnlich auch schon ausprobiert, aber da sind die Kennzahlen ja die gleichen (beides mal Umsatz). Wenn ich aber jetzt, wie anfangs beschrieben, zwei unterschiedliche Kennzahlen (z.B. Umsatz und Ausgaben) miteinander verrechnen möchte, klappt das ja nicht mehr. Und da hänge ich jetzt. Wenn ich das Modell ändere, würde sich das Problem auf jeden Fall auflösen. Aber ich weiß nicht, ob ich mir dann nicht andere Probleme einhandele.

Nochmal ein etwas besseres Beispiel, wenn ich zB den Gewinn aus Umsatz und Ausgabe für ALDI in 2013 berechnen wollte:







UnternehmenKennzahlJahrWert
ALDIUmsatz2013100
ALDIUmsatz2014110
ALDIAusgaben201340
LIDLAusgaben2013500


Sorry, wenn ich Dich etwas über Gebühr beanspruche.

Danke nochmals,
Jonas

DF6GL

Hallo,

naja, dann halt    Gewinn = Umsatz-Ausgaben


Domwert("Wert";"tblKennzahlen";"Unternehmen = 'Aldi' and [Jahr] = 2013 and Kennzahl = 'Umsatz') - Domwert(" Wert";"tblKennzahlen";"Unternehmen = 'Aldi' and [Jahr] = 2013 and Kennzahl = 'Ausgaben')
Viele Grüße vom Bodensee
Franz, DF6GL

Hilfestellung:  http://www.access-o-mania.de/forum/index.php?topic=6969.msg118738#msg118738

Links und Tipps:
1.   http://v.hdm-stuttgart.de/~riekert/lehre/db-kelz/
1a. http://www.tinohempel.de/info/info/datenbank/normalisierung.htm
1b. https://support.office.com/de-de/article/Grundlagen-des-Datenbankentwurfs-eb2159cf-1e30-401a-8084-bd4f9c9ca1f5#bmterms
2.   http://www.donkarl.com
3.   https://web.archive.org/web/20201201233522/http://www.dbwiki.net/
4.   http://www.access-tutorial.de/
5.   http://www.tty1.net/smart-questions_de.htm
6.   http://access.joposol.com/accept

Last but not least:   < F1 > für Hilfe
;) Learning by doing not by spoon-feed ;)

Tipp: Find and Replace for Access

MzKlMu

Hallo,
so wie in Deinem Beispiel ist die Tabelle richtig.
In einer Abfrage multiplizierst Du die Ausgaben mit -1
Die Abfarge sieht dann so aus:
Unternehmen Kennzahl Jahr Wert
ALDI Umsatz 2013 100
ALDI Umsatz 2014 110
ALDI Ausgaben 2013 -40
LIDL Ausgaben 2013 -500
Wenn Du jetzt diese Abfrage gruppierts und den Wert summierst hast Du folgendes Ergebnis:
Aldi  170
Lidl  -500

Diese Abfrage kannst Du auch auf Jahre oder Firmen filtern.

In der Tabelle für die Kennzahlen würde ich noch den Multiplikator mit erfassen:

KennzahID  KennzText  Multiplikator
     1           Umsatz             1
     2           Ausgaben         -1
     3           AnzMitarb          0




Gruß Klaus

jonas84

Zitat von: DF6GL am Juni 07, 2014, 19:37:48
Hallo,

naja, dann halt    Gewinn = Umsatz-Ausgaben


Domwert("Wert";"tblKennzahlen";"Unternehmen = 'Aldi' and [Jahr] = 2013 and Kennzahl = 'Umsatz') - Domwert(" Wert";"tblKennzahlen";"Unternehmen = 'Aldi' and [Jahr] = 2013 and Kennzahl = 'Ausgaben')

Hi, das macht genau was ich brauche, vielen Dank!

Merkwürdigerweise gibt mir die Abfrage zwar das richtige Ergebnis, aber statt nur einem Wert bekomme ich das Ergebnis so oft, wie die Tabelle Datensätze hat (der gleiche Wert ganz oft untereinander).

Grüße
Jonas

MzKlMu

Hallo,
wenn Du das für jeden Datensatz machst, erhältst Du auch in jedem Datensatz das Ergebnis. Über eine Abfrage gibt es keine andere Lösung, das ist auch nicht merkwürdig, sondern normal und richtig.

Schon mal über meinen Vorschlag/Hinweis nachgedacht?
Gruß Klaus

jonas84

Zitat von: MzKlMu am Juni 08, 2014, 13:19:02
Hallo,
wenn Du das für jeden Datensatz machst, erhältst Du auch in jedem Datensatz das Ergebnis. Über eine Abfrage gibt es keine andere Lösung, das ist auch nicht merkwürdig, sondern normal und richtig.

Schon mal über meinen Vorschlag/Hinweis nachgedacht?

Hey,
obwohl ich nur einen Wert habe, der den Filterkriterien entspricht? Ich hätte bei einem Lookup nur einen Wert erwartet, wenn es nur einen Wert gibt, der den Filterkriterien entspricht.

Ich möchte irgendwann verschiedene Werte aus verschiedenen Datensätzen mit verschiedenen mathematischen Operationen (plus,mal,minus,geteilt) berechnen. Das geht mit Deinem Vorschlag nicht, oder?

Zum Beispiel aus der obigen Tabelle:
(Umsatz ALDI 2013 + Umsatz ALDI 2014)/(Ausgaben LIDL 2013). Also konkret: (100+110)/500=0,42. Bekomme ich irgendwie über eine Abfrage eine Ausgabe, die mir "0,42" anzeigt?
Die Sinnhaftigkeit bei diesem Beispiel sei dahingestellt.

Danke und Gruß
Jonas

MzKlMu

Hallo,
DLoopup berechnet für jeden Datensatz. Du es immer die gleichen Ausgangswerte sind, wird in jedem Datensatz auch logischerweise das gleiche Ergebnis gezeigt. Und wenn Du 500 DS hast, hast Du 500x das gleiche Ergebnis. Es gibt ja in der Formel keinen Bezug zu einem Datensatz.

Wenn Du mal zusammenhängend beschreibst, was Du alles berechnen willst, lässt sich da bestimmt eine Lösung finden.

Ziel muss es sein, bereits über das Datenmodell die Zusammenhänge deutlich zu machen.

PS:
ZitatDie Sinnhaftigkeit bei diesem Beispiel sei dahingestellt.
was sollen unsinnige Beispiel für einen Sinn machen? Du erhöhst das Verständnis für die Zusammenhänge, wenn Du sinnhafte Beispiele machst bzw. zeigst.
Zitat(Umsatz ALDI 2013 + Umsatz ALDI 2014)/(Ausgaben LIDL 2013).
Was soll es z.B. für einen Sinn machen, Aldi 2013 und 2014 zu addieren um das dann durch die Ausgaben von LIDL 2013 zu dividieren. Solche Beispiele kannst Du Dir einfach sparen.

Gruß Klaus

jonas84

Alles klar, here we go:

Ich habe 20 Unternehmen, die ich miteinander vergleichen möchte. Zu diesen Unternehmen habe ich relativ viele Daten (circa 200 Kennzahlen) über 10 Jahre.

Aus diesen Kennzahlen möchte ich nun gewisse KPIs (Key Performance Indicators) berechnen, die sich aus bestimmten Kennzahlen zusammensetzen.

Jetzt nochmal ein hoffentlich etwas sinnvolleres Beispiel:















UnternehmenKennzahlJahrWert
ALDIUmsatz2012100
ALDIUmsatz2013110
ALDIAusgaben201280
ALDIAusgaben201375
ALDIFilialen20121150
ALDIFilialen20131200
LIDLUmsatz2012150
LIDLUmsatz2013140
LIDLAusgaben2012125
LIDLAusgaben2013120
LIDLFilialen201280
LIDLFilialen201390

Die folgenden KPIs sind zwar fiktiv, aber verdeutlichen hoffentlich mein Vorhaben:

Pro Unternehmen und Jahr zu berechnen:
KPI1: Gewinn = Umsatz-Ausgaben
(hier z.B. für ALDI in 2012: 100-80)
KPI2: Durchschn. Umsatz pro Filiale = Umsatz/Filialen
(hier z.B. für LIDL in 2013: 140/90)

Pro Unternehmen zu berechnen:
KPI3: Durchschn. Anzahl Filialen über Periode = Summe(Filialen)/(Anzahl Jahre)
(hier z.B. für LIDL: (80+90)/2)

Pro Jahr zu berechnen:
KPI4: Industrie-Durchschnitt Umsatz = Summe(Umsatz über alle Unternehmen)/(Anzahl Unternehmen)
(hier z.B. für 2012: (100+150)/2)

Ich hoffe, das Beispiel und die zu berechnenden Werte sind jetzt verständlicher.

Danke für die Mühen und viele Grüße,
Jonas

MzKlMu

Hallo,
da die Werte nicht untereinander in Zusammenhang stehen, würde ich doch die Werte in einzelnen Spalte erfassen. Die Rechnerei wird deutlich einfacher.
Gruß Klaus

jonas84

#13
Zitat von: MzKlMu am Juni 08, 2014, 15:29:09
Hallo,
da die Werte nicht untereinander in Zusammenhang stehen, würde ich doch die Werte in einzelnen Spalte erfassen. Die Rechnerei wird deutlich einfacher.

Hallo, danke für Deine Rückmeldung. Wenn ich über 200 Kennzahlen habe, stoße ich doch so irgendwann an die Grenzen von Access (Maximum an Datenfeldern ist 255), oder? Gibt es da noch andere sinnvolle Lösungen?

Update: Die Fragen gehen jetzt in eine ganz andere Richtung als ursprünglich geplant. Ich habe dafür einen neuen Thread eröffnet. Damit vielen Dank für die Hilfe für mein ursprüngliches Problem!

Gruß
Jonas