Neu:

  Keine Werbeeinblendungen für registrierte User

  ❤ Jede SPENDE hilft unserer Community ❤



  🌹 Danke für Eure Unterstützung 🙏


komplexe berechnete Felderin Abfragen

BASE ermöglicht es Ihnen, Ihre Daten in einer Datenbank direkt mit OpenOffice.org zu bearbeiten.
F3K Total
Beiträge: 914
Registriert: Mo 1. Aug 2011, 00:03

Re: komplexe berechnete Felderin Abfragen

Beitrag von F3K Total » Mo 30. Mär 2020, 18:32

Hi
1.) weil du sie nicht, wie oben erwähnt, im direkten SQL-Mode ausführst?
2.)nach dem Erstellen einer Ansicht im Tabellenbereich einmal auf Menü Ansicht-Tabellen aktualisieren klicken.
Gruß R
Windows 10: AOO, LO Linux Mint: AOO, LO

BBMonster
Beiträge: 19
Registriert: Sa 16. Feb 2019, 17:26

Re: komplexe berechnete Felderin Abfragen

Beitrag von BBMonster » Mi 1. Apr 2020, 15:17

Hallo R.
zunächst mal eine 80%-Erfolgsmeldung: ich konnte den Score des aktuellen Tages ohne Scratchdaten nur mit SQL-Mitteln berechnen. Der Weg dorthin ist auch noch einfacher als meine VBA-Prozedur zum erzeugen der Scratchdaten. Was mir jetzt noch fehlt, ist das Bilden des Mittelwerts über die letzten 5 Tage.

Schlüssel für dieses Ergebnis war es in dieser Diskussion mit Dir zu lernen, dass SQL-Kommandos an 2 verschiedenen Stellen interpretiert werden (Base und Firebird) die man getrennt adressieren kann/muß. Deshalb auch im letzten Post die Frage 1: "Warum kann ich Deine 'Abfrage1' nicht in der oben beschriebenen Art kopieren?" Hier möchte ich nochmal nachlegen. Es ist mir inzwischen schon klar, dass man die direkten Firebirdbefehle nur im SQL-Fenster oder in einer Ansicht verwenden kann. Frage 1 modifiziert lautet: Warum sieht Deine Abfrage1 wie eine Abfrage aus und ist keine Ansicht und wie erzeugt bzw erkennt man eine solche Pseudo-Abfrage? Als "Normalabfrage" würde ich eine sehen, die einfach von Base verstanden wird, also ohne SQL-Fenster.

Nun zu den letzten 20%, die mir noch dazu fehlen, meinen VBA-Code zu eliminieren:
Wie schon früher beschrieben, sieht mein Algorithmus zum Bewerten von Wertpapieren wie folgt aus:
Schritt 1. Berechne "Rohscores", die ich im ursprünglichen CALC-Sheet als VBA-Prozeduren implementiert habe. Diese heissen
doVerzinsungN(ISIN, Basisdatum, Dauer) (=Verzinsung des Kurs-Durchschnitts über 'Dauer' Tage, Zeitraum endet an 'Basisdatum')
doAnnuZins(ISIN, Kaufdatum) (=(Kursheute/KursKaufdatum-1)*365/(Heute - Kaufdatum))

Schritt2: Rechne aus den Daten von Schritt 1 ein Mittel, ich rechne hier (3*Verzinsung(Basisdatum, 30 Tage)+Verzinsung (Basisdatum, 60Tage) + AnnuZins)/5

Der noch fehlende Schritt 3: Mache Schritt 2 für die letzten 5 Tage und bilde daraus den Mittelwert.
Wenn wir uns bei der Diskussion mal auf doVerzinsungN beschränken:
Diese Verzinsung kann über eine Aggregatabfrage in SQL berechnet werden: Ich habe mittlerweile über meine Tabelle tblKurse eine Ansicht namens ansKurseGruppiert gelegt, die mir über die Funktion ROW_NUMBER() as "ZNR" pro ISIN die Einträge durchnummeriert.

Die Abfrage für den 30-Tage-Durchschnitt lautet dann:
SELECT "kurISIN", AVG( "kurKurs" ) "berMW30" FROM "ansKurseGruppiert" WHERE "ZNR" <= 30 GROUP BY "ansKurseGruppiert"."kurISIN"

Um nun die Daten für die Basisdatumswerte der letzten 5 Tagezu bestimmen, könnte ich in einer Holzhammermethode nun 5 solcher Aggregatfunktionen schreiben und dabei statt ZNR <= 30 scheiben ZNR between (2 and 31), (3 and 32), ...
Ich hätte lieber was, das das obenstehende Gruppierungsselect als Unterabfrage verwendet. Symbolisch:
AVG(For i = 0 to 4
{SELECT "kurISIN", AVG( "kurKurs" ) "berMW30" FROM "ansKurseGruppiert" WHERE "ZNR" BETWEEN i and 30+i GROUP BY "ansKurseGruppiert"."kurISIN"})

Frage: Gibt es in SQL die Möglichkeit das obige SELECT mit dem 'GROUP BY' als Unterabfrage zu verwenden, so dass ich eine Abfrage hätte, die das Basisdatum beinhaltet und das mir dazu die gruppierten Werte liefert. Dann könnte ich das nochmal gruppieren und hätte was ich brauche.

Ich stöbere gerade durch die anderen Window-Funktionen im PDF "Firebird3 Windowing Functions" von Philippe Makowski von IBPhoenix und hoffe, dort was zu finden.
Viele Grüße
BBMonster

F3K Total
Beiträge: 914
Registriert: Mo 1. Aug 2011, 00:03

Re: komplexe berechnete Felderin Abfragen

Beitrag von F3K Total » Mi 1. Apr 2020, 17:21

Moin, was für ein Text! Puh!
Kannst du nicht einfach die Datei hochladen, dann noch mal sagen welche Werte du noch weiter wie umrechnen möchtest, es findet sich bestimmt eine SQL-Lösung.
Gruß R
Windows 10: AOO, LO Linux Mint: AOO, LO

BBMonster
Beiträge: 19
Registriert: Sa 16. Feb 2019, 17:26

Re: komplexe berechnete Felderin Abfragen

Beitrag von BBMonster » Fr 3. Apr 2020, 10:53

Hallo R.
ich werde die Datenbank hochladen. Aber vorher mache ich noch 2 Dinge:
1. Aufräumen und konsolidieren
2. Das von Dir angeregte Modell vervollständigen, damit die verbleibende Problemstellung auch vollständig auf dem Tisch liegt.
Ich schätze, ich habs bis Montag.
Viele Grüße
BBMonster

BBMonster
Beiträge: 19
Registriert: Sa 16. Feb 2019, 17:26

Re: komplexe berechnete Felderin Abfragen

Beitrag von BBMonster » Mo 6. Apr 2020, 12:55

Hallo R.,
ich hab den gewünschten Stand erreicht und lade Dir 2 Dateien hoch:
1. Die Datenbank Depot.odb
2. Die Dokumentation EigendepotStruktur-Neu.odg. In dieser habe ich die Beziehungen der Abfragen aufgezeichnet, denn in Base konnte zumindest ich nur Beziehungen zwischen Tabellen definieren. Das meiste der Doku kannst Du ignorieren, denn meine Restprobleme habe ich wegen der Notwendigkeit einer UNION nicht in Queries, sondern in Ansichten implementiert. In der Datenbank/Doku beginnen die Namen aller Abfragen mit 'qry' und die der Ansichten mit 'ans'.
Die grafische Darstellung der Ansichten beginnt mit 'ansKurse', aus denen ich mittels der Ansichten 'ans_MW30_x_y' jeweils den Mittelwert der Kurse zwischen den Datumswerten (Heute - x) und (Heute - y) berechne. Aus diesen Mittelwerten berechne ich in den 'ans_Zins30_x_y' den Zinssatz mit dem der Mittelwert aus 'ans_MW30_x_y' verzinst werden muss, um den Kurs von (Heute - x) zu bekommen.
Diese 5 Zinssätze packe ich in 'ans_Zins30_Scores' per union zusammen, damit ich in der Folgeabfrage 'ans_Zins30_MWScores' via Gruppierung den Mittelwert pro ISIN bilden kann.

Im eigentlichen Algorithmus mache ich das noch für den Zeitraum von 60 Tagen und den Annualisierten Zins. Ich habe für die Berechnung des MWZins30 12 Ansichten gebraucht, macht also für den eigenlichen Algorithmus 36 Ansichten. Ich hoffe, dass Du die 12 Abfragen konsolidieren kannst, denn dieser Ansatz wäre wartungstechnisch ein Alptraum und ebenso eine eventuelle Anpassung auf andere betrachtete Zeiträume.
Frage also: Kann man die 12 Abfragen ans* algoritmisch zusammenfassen?
Viele Grüße
BBMonster
Dateianhänge
Base.zip
(186.58 KiB) 51-mal heruntergeladen

F3K Total
Beiträge: 914
Registriert: Mo 1. Aug 2011, 00:03

Re: komplexe berechnete Felderin Abfragen

Beitrag von F3K Total » Fr 10. Apr 2020, 10:54

Hallo BB,
ich habe jetzt keine Zeit deine Ansichten alle neu zu erstellen,
wüsste nicht, wie du die zwölf zusammenfassen könntest, aber:
Wenn du dir eine einfache einzeilige Tabelle, "tbl_Dauer" mit einer Integer-Spalte "DAUER" anlegst, die du einfach z.B. von 30 auf 60 ändern kannst, und deine Ansichten wie folgt änderst, dann brauchst du keine weiteren Ansichten mehr.

Code: Alles auswählen

ans_MW30_1_30
SELECT "kurISIN", MIN( "kurDatum" ) "berDatum30", AVG( "kurKurs" ) "berMW30" FROM "ansKurseGruppiert" WHERE "ZNR" BETWEEN 1 AND (SELECT "DAUER" FROM "tbl_Dauer") GROUP BY "ansKurseGruppiert"."kurISIN"
ans_MW30_2_31
SELECT "kurISIN", MIN( "kurDatum" ) "berDatum30", AVG( "kurKurs" ) "berMW30" FROM "ansKurseGruppiert" WHERE "ZNR" BETWEEN 2 AND (SELECT "DAUER" FROM "tbl_Dauer")+1 GROUP BY "ansKurseGruppiert"."kurISIN"
ans_MW30_3_32
SELECT "kurISIN", MIN( "kurDatum" ) "berDatum30", AVG( "kurKurs" ) "berMW30" FROM "ansKurseGruppiert" WHERE "ZNR" BETWEEN 3 AND (SELECT "DAUER" FROM "tbl_Dauer")+2 GROUP BY "ansKurseGruppiert"."kurISIN"
ans_MW30_4_33
SELECT "kurISIN", MIN( "kurDatum" ) "berDatum30", AVG( "kurKurs" ) "berMW30" FROM "ansKurseGruppiert" WHERE "ZNR" BETWEEN 4 AND (SELECT "DAUER" FROM "tbl_Dauer")+3 GROUP BY "ansKurseGruppiert"."kurISIN"
ans_MW30_5_34
SELECT "kurISIN", MIN( "kurDatum" ) "berDatum30", AVG( "kurKurs" ) "berMW30" FROM "ansKurseGruppiert" WHERE "ZNR" BETWEEN 5 AND (SELECT "DAUER" FROM "tbl_Dauer")+4 GROUP BY "ansKurseGruppiert"."kurISIN"
HTH R
Zuletzt geändert von F3K Total am Fr 10. Apr 2020, 18:40, insgesamt 1-mal geändert.
Windows 10: AOO, LO Linux Mint: AOO, LO

BBMonster
Beiträge: 19
Registriert: Sa 16. Feb 2019, 17:26

Re: komplexe berechnete Felderin Abfragen

Beitrag von BBMonster » Fr 10. Apr 2020, 13:34

Hallo R.
der Vorschlag passt, man kann ihn erweitern, indem man über das select ganz verschiedene Zeiträume/Werte abfragt.
Mein Problem ist damit vollständig gelöst, vielen Dank dafür.
Gruß
BBMonster :D

F3K Total
Beiträge: 914
Registriert: Mo 1. Aug 2011, 00:03

Re: komplexe berechnete Felderin Abfragen

Beitrag von F3K Total » Fr 10. Apr 2020, 18:41

Halleluja :D
Windows 10: AOO, LO Linux Mint: AOO, LO

deckrdshaw
Beiträge: 1
Registriert: Mi 7. Okt 2020, 13:11

Re: komplexe berechnete Felderin Abfragen

Beitrag von deckrdshaw » Mi 7. Okt 2020, 13:14

1. Rohdatum/Zwischenwert: Berechnen, mit welchem Zinssatz sich der gleitende Durchschnitt über 30 Tage verzinst, um den aktuellen Kurs zu bekommen.
Den gleitenden Durchschnitt zu einer ISIN aus den 30 Kursen vor dem Datum 'daStartDatum' rechne ich über VBA mittels der Funktion doDurchschnitt (Code im Anhang). Die Verzinsung dieses Durchschnitts berechne ich in der Funktion doVerzinsungN. Das 'do' steht für den Datentyp des Rückgabewerts (double)
2. Rohdatum: wie 1 nur für 60 Tage
3. Rohdatum: Ich berechne den annualisierten Gewinn, den ein Wertpapier erzielt hat. Das ist der Gewinn - also (Aktueller Kurs - Kaufkurs)* Stücke/DepotwertbeimKauf - hochskaliert auf einen Jahreszins, also wenn das Wertpapier 182 Tage in meinem Besitz ist, multipliziere ich den o.a. Bruch mit 2. Dem Code für die Berechnung habe ich nicht so einfach, denn einen Teil der Logik der Berechnung des Annualsierten Gewinns bilde ich über Abfragen ab, im VBA-Code rechne ich dann den Rest aus den Abfragedaten. Den Restcode findest Du ebenfalls im Anhang in der VBA-Prozedur 'SchreibeScoreRohdaten' und zwar in der innersten DO-Schleife den CASE "AnnuZins"


-----------------------------------------------------------------------
If you are American nationality holders and planning to visit Azerbaijan, you can apply online tourist visa for AZ from read more .
juve

Antworten