PDA

View Full Version : SQL Abfrage - Bezug Artikelgruppe Lieferanten



snibbe
16-05-12, 12:36
Hallo Leute,
ich habe ein kleines Problem mit folgender Abfrage:

Ich habe u.a. 2 Tabellen. Eine mit dem Namen Teil, welche Produkte enthält, die nach ABC Gütern unterteilt sind und
eine Tabelle Konditionen, die die jeweilige Lieferantennummer zu einem Artikel sowie den Einkaufspreis enthält.

Nun möchte ich einen beliebigen Lieferanten (hier z.B. Lieferantid = 1) listen lassen, der z.B. die Produkte der Gruppe A nicht liefert.

Meine Abfrage sieht soweit wie folgt aus:


select k.lieferantid, t.produktbezeichnung from teil t, konditionen k
where k.lieferantid = 1
and not exists (select t.artikelnummer from teil t
where t.abcklassifikation = 'A' and t.artikelnummer = k.artikelnummer)
and t.artikelnummer = k.artikelnummer;

Hier erhalte ich zwar Artikel, allerdings sind diese von der Produktgruppe B und/oder C die der Lieferant 1 liefert. D.h. die A Produkte werden rausgefiltert.
Wie kann ich diese anpassen, damit ich mein gewünschtes Ergebnis erhalte? Bzw. ist exists da der richtige Weg für (bin noch SQL Anfänger)?

Vielen Dank im Voraus.

Fuerchau
19-05-12, 16:01
Da keiner darauf eine Antwort hat, versuche ich es mal:

Deine Abfrage ist vom Grundsatz her nicht falsch, da du ja eigentlich das korrekte Ergebnis bekommst.
Du erfährst, dass der Lieferant A-Artikel nicht beliefert sondern nur die B/C-Artikel.

Allerdings ist die Fragestellung hier noch mal zu prüfen.
Wenn du B/C-Artikel auch nicht willst, musst du die "abcklassifikation" aus der Abfrage ganz rauslassen.
Mit anderen Worten:
Liefert der Lieferant überhaupt etwas, somit also auch keine A-Artikel?

Hierfür ist aber die Konditionsdatei die falsche Basis, da ja hier die Artikel die geliefert werden drin stehen, somit also mindestens B/C-Artikel, die du ja auch nicht willst.

Also müsste der Lieferantenstamm mit Konditionen verknüpft werden um eben zu prüfen, ober der Lieferant überhaupt etwas liefert und somit natürlich auch keine A-Artikel.

select l.lieferantid from lieferant l
where not exists
(select * from konditionen k
where l.lieferantid = k.lieferantid)

Anmerkung:
Im Exists-Subselect ist es egal welche Felder angegeben werden, da diese ignoriert werden.

snibbe
19-05-12, 18:03
Vielen Dank für die Antwort.

Mit dieser Abfrage erhalte ich aber keine Ausgabe, da bei mir jeder Lieferant was liefert.

Vielleicht habe ich mich mit meiner Fragestellung etwas unverständlich ausgedrückt. Ich möchte gerne wissen welche Produkte von einem Lieferanten x nicht geliefert werden. Und dies halt z.B. bezogen auf die Produktgruppe A.

Beispiel:
Produkt 1, Typ: A
Produkt 2, Typ: B
Produkt 3, Typ: C

Lieferant 1 liefert Produkt 1 und 2:
-> folglich bei Abfrage dieser LieferantID keine Ausgabe, da alle verfügbaren A Produkte von diesem Lieferanten geliefert werden

Lieferant 2 liefert Produkt 1 nicht:
-> folglich bei Abfrage dieser LieferantID Ausgabe: Produkt 1, da dieses Produkt nicht im Lieferprogramm enthalten ist und von der Gruppe A ist

Ich hoffe das ist so verständlicher, was ich versuche zu erreichen. Aus diesem Grunde hatte ich auch die Konditionsdatei verwendet, da dort alle Artikel gelistet sind.

Danke auch nochmal für die Anmerkung mit dem Subselect im Exists :)

Fuerchau
21-05-12, 08:04
OK, das ist verständlicher.
Allerdings ist die Basistabelle dann der Artikelstamm und nicht die Konditionsdatei, da ja die Artikel in dieser fehlen:

select * from teil t
where t.abcklassifikation = 'A'
and not exists
(select * from konditionen k
where k.artikelnummer = t.artikelnummer and k.lieferantid=1)

Damit erhältst du eben die Artikel, die von diesem Lieferanten nicht beliefert werden.

snibbe
21-05-12, 18:29
Vielen lieben Dank, das klappt wunderbar.

ITFreak
26-05-12, 20:03
Ich dachte, ich kenne mich ein wenig mit SQL aus, da mir fortgeschrittene SQL-Kenntnisse bescheinigt wurden. Aber ich hab überall nur 'Bahnhof' gelesen oO

B.Hauser
27-05-12, 07:58
Ich dachte, ich kenne mich ein wenig mit SQL aus, da mir fortgeschrittene SQL-Kenntnisse bescheinigt wurden. Aber ich hab überall nur 'Bahnhof' gelesen oO

... das Problem ist, dass auch diejeningen, die "fortgeschrittene SQL-Kenntnisse" bestätigen meist nur die Baiscs kennen.

Ich hatte schon mehrfach Anfragen nach Auffrischungsschulungen zum Thema SQL-Abfragen (von allem anderen nicht zu reden), bei denen die Kunden meinten ein Tag würde locker reichen, da alle Teilnehmer SQL könnten. Wir einigen uns dann uns dann i.d.R. auf einen Tag und einen weiteren optionalen Tag.
... bislang wurden immer beide Tage gehalten und z.T. wurde sogar noch ein weiterer Tag gebucht.

Birgitta

Fuerchau
27-05-12, 18:57
Dem kann ich nur zustimmen.
Ich entdecke (auch Dank Birgitta) immer neue Möglichkeiten.