2.1k Aufrufe
Gefragt in Datenbanken von worm1977 Einsteiger_in (36 Punkte)
Hallo zusammen

In meiner Oracle-Datenbank habe ich in einer Tabelle Kurs-Informationen.

Nun kann es bei einer Auswahl von Titeln zu fehlenden Kursen in einem bestimmten Zeitfenster gekommen sein.

Nun möchte ich wissen, welche der möglichen betroffenen Titeln haben wir im Einsatz, aber in dem Zeitfenster keine Kurse erhalten.

Folgendes habe ich mal probiert:

select distinct t.idtis, t.gres, t.grecps from titcrs t, tisisin s, rtitiex i
where t.idtis || t.gres || t.grecps = i.idtis || i.gres || i.grecps
and i.typiexs = 'ISI'
and t.typcrss = 'TIS'
and trim(i.idiexs) in ( select trim(isin) from tisisin )
and t.crsdtl not between 20111119 and 20111123

In der Tabelle titcrs sind alle Kurse gespeichert, die wir jemals erhalten haben. In der Tabelle rtitiex ist das Mapping zwischen internen Identifikatoren und externen (ISIN) gespeichert. In der Tabelle tisisin ist eine Liste von möglichen betroffenen Titeln.

Nun müsste ich wissen welche Titel von tisisin sind in der Tabelle titcrs vorhanden, ober ohne Kurse zwischen dem 19.11.2011 und dem 23.11.2011.

Meine obige Abfrage liefert mir dann aber eine Liste von Titeln, für welche wir ausserhalb dieses Zeitfensters einen Kurs erhalten haben.

Kann mir da jemand weiterhelfen?

Besten Dank schon mal im Voraus.

Gruss Rolf

5 Antworten

0 Punkte
Beantwortet von paul1 Experte (4.9k Punkte)
Hallo Rolf,

Leider hatte ich mit Oracle noch nicht das Vergnügen.

in Access würde der Code in der Abfrage so aussehen:

wenn im Feld Kurs 0(Null )steht:

SELECT titcrs.Datum, titcrs.Titel, titcrs.Kurs
FROM titcrs
WHERE (((titcrs.Datum) Between #11/19/2011# And #11/23/2011#) AND ((titcrs.Titel)="tisisin") AND ((titcrs.Kurs)=0));

wenn Feld Kurs leer ist:

SELECT titcrs.Datum, titcrs.Titel, titcrs.Kurs
FROM titcrs
WHERE (((titcrs.Datum) Between #11/19/2011# And #11/23/2011#) AND ((titcrs.Titel)="tisisin") AND ((titcrs.Kurs) Is Null));


Der SQL-Code ist nach meinen Informationen in Oracle etwas anders, aber vielleicht gibt es die Möglichkeit der Konvertierung, jedenfalls wird in der Zeit vom 19.11.2011 bis 23.11.2011 der Titel: „tisisin“ angezeigt, wenn gleichzeitig das Feld „Kurs“ leer ist oder eine Null enthält.

Die von mir testweise vergebenen Felder:
Datum; Titel; Kurs
Die Tabelle habe ich „titcrs“ getauft.


Gruß

Paul1

Excel/Access 2003
0 Punkte
Beantwortet von worm1977 Einsteiger_in (36 Punkte)
Hallo Paul

Danke für deinen Beitrag.

Nun, wenn ich deinen Lösungsvorschlag richtig verstehe, müsste für den Zeitraum vom #11/19/2011# bis #11/23/2011# jeweils ein Eintrag mit Kurs 0 (oder null) in der Tabelle titcrs vorhanden sein. Wenn aber kein Kurs geliefert wurde, ist auch kein Datensatz vorhanden.

Mir hat schon mal jemand den Tip gegeben mit outer joints zu arbeiten ... damit kenne ich mich aber nicht aus.

Nun, ich probiere das mal, indem ich die Oracle-Datenbank mittels ODBC-Schnittstelle an Access anbinde ... vielleicht funktioniert's ja.

Melde mich wieder...

Gruss Rolf
0 Punkte
Beantwortet von worm1977 Einsteiger_in (36 Punkte)
Hallo Paul

Hab's jetzt mal über Access probiert ...

Folgenden SQL habe ich also erhalten:

SELECT APSYS_TITCRS.IDTIS, APSYS_TITCRS.GRES, APSYS_TITCRS.GRECPS, APSYS_TITCRS.CRSDTL
FROM APSYS_TITCRS INNER JOIN (APSYS_RTITIEX INNER JOIN DBPROD_TISISIN ON APSYS_RTITIEX.IDIEXS = DBPROD_TISISIN.ISIN) ON (APSYS_TITCRS.IDTIS = APSYS_RTITIEX.IDTIS) AND (APSYS_TITCRS.GRES = APSYS_RTITIEX.GRES) AND (APSYS_TITCRS.GRECPS = APSYS_RTITIEX.GRECPS)
WHERE (((APSYS_TITCRS.CRSDTL) Between 20111119 And 20111123) AND ((APSYS_RTITIEX.idiexs)=[DBPROD_TISISIN].[ISIN]) AND ((APSYS_TITCRS.crsd) Is Null) AND ((APSYS_RTITIEX.TYPIEXS)="ISI") AND ((APSYS_TITCRS.TYPCRSS)="TIS"));

Diese Abfrage bringt jetzt nichts zurück...

Das kann jetzt zwei Dinge bedeuten... Entweder wir haben keine fehlenden Kurse oder die Abfrage liefert nicht das, was sie solte :-)

Gruss Rolf
0 Punkte
Beantwortet von paul1 Experte (4.9k Punkte)
Hallo Rolf,

probiere es mit diesem Code, habe das Datum und das Leerkriterium rausgenommen, sortiere anschließend das Datum und schau nach, ob unter "tisisin" im gleichen Datensatz unter "Kurs" eine 0 (Null) oder nichts drinnensteht (leer). Natürlich im gegenständlichen Zeitraum (19.11.2011 bis 23.11.2011)

SELECT titcrs.Datum, titcrs.Titel, titcrs.Kurs
FROM titcrs
WHERE (((titcrs.Titel)="tisisin"));

Hast Du beide Varianten mit Null und Leer ausprobiert?

Schicke Dir zwecks Nachvollziehung und damit Du siehst, dass es funktioniert eine Beispieldatei, schau Dir vor allem die Entwurfsansicht und die SQL-Ansicht der Abfrage "titcrs Abfrage" an.
In diesem Beispiel sind die maßgebenden Kursfelder leer, daher der Code wie in der SQL-Ansicht zu sehen:

SELECT titcrs.Datum, titcrs.Titel, titcrs.Kurs
FROM titcrs
WHERE (((titcrs.Datum) Between #11/19/2011# And #11/23/2011#) AND ((titcrs.Titel)="tisisin") AND ((titcrs.Kurs) Is Null));

Beispiel

Sollten die Kursfelder jedoch eine 0(Null) haben, wäre der andere Code (wie in AW1 zu sehen) anzuwenden.

Aus dem für Oracel umgewandelten Code kann ich leider mangels spezieller Oracle Kenntnisse nichts erkennen.


Gruß

Paul1
0 Punkte
Beantwortet von worm1977 Einsteiger_in (36 Punkte)
Hallo Paul

Hab mir den Code nochmals angeschaut...

War da wohl einfach zu lange dran und hab den Wald vor lauter Bäumen nicht mehr gesehen...

Mein SQL liefert ja schon, was ich haben will...

Sorry, da war ich einfach zu doof, um das zu erkennen.

Gruss Rolf
...