Oracle SQL - Null-Werte

marco1973nrw

Cadet 4th Year
Registriert
Juli 2008
Beiträge
82
Hallo,
vielleicht kennt sich ja jemand hier mit Oracle aus und kann mir helfen.
Also ich habe folgende Tabellen

Kunden: Kundennummer, Name, Ort, Versicherungsart.
Statistik: Kundennummer, Rechnungsnummer, Rechnungsdatum,

jetzt möchte ich alle Kunden mit Versicherungsart X ermitteln, die in den letzten 300 Tagen weniger als 2 Rechnungen erhalten haben.

Also habe ich mir die Werte aus Tabelle Kunden geholt, mit left join die letzte Rechnung dazu geholt, mit einem weitern left join die Anzahl der Rechnungen in den letzten 300 Tagen.

Soweit kein Problem, in den Bedingungen habe ich dann unten angegeben,

where (nvl(s3.AnzahlRechnungen, 0) < 2

s3 = select kunde, count(rechnungen) AnzahlRechnungen from Statistik where rechnungsdatum > sysdate -300

Das Problem ist nun, dass in der Tabelle S3 nicht die Kunden aufgeführt sind, die keine Rechnung erhalten haben. Ich bekomme also nur die Kunden geliefert, die wenigstens 1 Rechnungen bekommen haben.

Ich komme da nicht weiter.... hoffentlich hat hier jemand Lust weiter zu helfen.

Vielen DANK im Voraus.

LG
Marco
 
Ich gebe dir mal ein Stichwort, vielleicht reicht es ja: "outer join"
 
  • Gefällt mir
Reaktionen: marco1973nrw
Ich schätze du gehst das Problem falsch herum an.
Du versucht die Kunden aus einer Tabelle auszulesen, in der es gar nicht alle gibt. Keine Rechnung => Kein Rechnungsdatum => kein Kunde in dieser Tabelle.
Du musst dir die Tabelle noch dazuholen, in der die Kunden geführt werden und dann die Statistik-Tabelle joinen.
 
  • Gefällt mir
Reaktionen: marco1973nrw
Hallo,
Korrigiere mich, outer join sollte das Problem beheben.
Beste Grüße
 
Zuletzt bearbeitet: (Korrektur)
  • Gefällt mir
Reaktionen: marco1973nrw
kaikuwe schrieb:
Ich gebe dir mal ein Stichwort, vielleicht reicht es ja: "outer join"
Was denkst du denn, was ein left join ist, den er bereits nutzt?
burglar225 schrieb:
Du versucht die Kunden aus einer Tabelle auszulesen, in der es gar nicht alle gibt.
Eigentlich schreibt er, dass er von der Kundentabelle mit allen Kunden ausgeht und die Rechnungen dazu joined.
Das wäre auch richtig.

Es würde vermutlich helfen den Fehler zu finden, wenn das ganze Query gepostet wird.
Ich habe leider kein Oracle hier, aber mit MSSQL funktioniert sowas hier einwandfrei:

select a.akten_guid, count(d.dokument)
from dbo.akten a
left join dbo.dokumente d on a.Akten_Guid = d.Akten_Guid
group by a.Akten_Guid
having count(d.Dokument) < 2
 
  • Gefällt mir
Reaktionen: GroMag und marco1973nrw
Ich schließe mich an, dass wir definitiv die vollständigen Statements brauchen. So können wir weitestgehend nur raten.
 
  • Gefällt mir
Reaktionen: marco1973nrw
Azareus schrieb:
Hallo,
outer join wird nicht zum Ziel führen, da auch Kunden gesucht werden mit einer Rechnung.

....

Hoffe ich konnte helfen.

Doch klar hilft ein outer join.

Es ist ein left outer join aller Kunden mit der Statistik (inkl where bedingung). Oder ein Left outer join aller Kunden mit dem subselect auf der Statistik.
Ergänzung ()

Enurian schrieb:
Was denkst du denn, was ein left join ist, den er bereits nutzt?

...

Sorry...das left hatte ich überlesen. Aber das ist der richtige Ansatz.
 
  • Gefällt mir
Reaktionen: marco1973nrw
Oh.. ihr seid schneller als gedacht :)
mit Having habe ich noch nicht versucht... weiß auch noch nicht, wie ich es einsetzen müsste...

hier ist meine Abfrage, die genau einen Treffer ergibt, da es nur einen Kunden mit einer Rechnung gibt. Die vielen mit 0 Rechnungen findet er nicht...

select ad.adrn,
ad.name,
ad.ort,
ad.artvers Versicherungsart,
ad.kvers Versicherungshöhe,
ad.klim,
ad.klim2,
ad.datklim2,
s.Letzte_RN,
s.LetzteRechnung,
s2.ANZRG "Anz.Rg.Ges",
s3.anzrg "Anz.Rg.300T"
from KUNDEN ad
left join (select kdnr, max(renr) Letzte_RN, max(reda) LetzteRechnung -- Ermittlung der letzten Rechnung
from STATISTIK
where sart = 'V'
group by kdnr) s
on ad.adrn = s.kdnr
left join (select kdnr, count(renr) ANZRG -- Anzahl Rechnungen Gesamt
from STATISTIK
where sart = 'V'
group by kdnr) s2
on s.kdnr = s2.kdnr
left join (select kdnr, count(renr) ANZRG -- Anzahl Rechnungen in den letzten 300 Tagen
from STATISTIK
where sart = 'V'
and reda > sysdate - 300
group by kdnr) s3
on s.kdnr = s3.kdnr
where ad.sart = 'K'
and (ad.artvers in ('U', 'A', 'N') or ad.artvers is null) -- Alle Kunden mit genannten Versicherungsarten
and s.LetzteRechnung > sysdate - 300 -- Letzte Rechnung mehr als 300 Tage alt.
and nvl(s3.anzrg, 0) < 2 -- Problem: wenn keine Rechnung da ist, dann gibt es keinen Wert und somit taucht der Kunde nicht auf.
 
marco1973nrw schrieb:
....
left join (select kdnr, count(renr) ANZRG -- Anzahl Rechnungen in den letzten 300 Tagen
from STATISTIK
where sart = 'V'
and reda > sysdate - 300
group by kdnr having count(*) < 2) s3
on s.kdnr = s3.kdnr
where ad.sart = 'K'
and (ad.artvers in ('U', 'A', 'N') or ad.artvers is null) -- Alle Kunden mit genannten Versicherungsarten
and s.LetzteRechnung > sysdate - 300 -- Letzte Rechnung mehr als 300 Tage alt.
-- and nvl(s3.anzrg, 0) < 2 -- Problem: wenn keine Rechnung da ist, dann gibt es keinen Wert und somit taucht der Kunde nicht auf.

Mit having sollte das passen.
 
  • Gefällt mir
Reaktionen: marco1973nrw
kaikuwe schrieb:
Mit having sollte das passen.

wo und wie verwende ich das having in der Abfrage?
Ergänzung ()

ach... sehe gerade, dass du es schon eingefügt hast... sorry :D
Ergänzung ()

ich bin begeistert. Zum einen von Oracle... wie einfach die Lösung ist, wenn man sich auskennt zum anderen von der Schnelligkeit und Hilfsbereitschaft hier im Forum.

Also ich bekomme jetzt auch die Kunden angezeigt, die keine Rechnung bekommen haben. Vielen, vielen Dank.
 
  • Gefällt mir
Reaktionen: kaikuwe und burglar225
Eine Erfolgsgeschichte für Dich -
ein Trauerspiel für ach so viele Versicherungskunden, die sich jetzt auf Rechnungen einstellen dürfen...
 
  • Gefällt mir
Reaktionen: maloz
Phrasendreher schrieb:
ein Trauerspiel für ach so viele Versicherungskunden, die sich jetzt auf Rechnungen einstellen dürfen...
War zwar keine Versicherung, sondern Lieferverträge, aber genau diese Situation hatte ich mal :D Ich hab Code überarbeitet und es hat sich herausgestellt, dass bisher zu wenig berechnet wurde.
 
Das ist nur eine Kontrolle für die Kreditversicherungsverträge. Pauschal versicherte Kunden müssen in den letzten 12 Monaten zwei Umsätze haben, damit sie für neue Aufträge versichert sind. Also keine Sorge ;-)
 
  • Gefällt mir
Reaktionen: burglar225
Zurück
Oben