Komplizierte SQL-Abfrage mit IF oder ähnlichem

Trantüte

Grünschnabel
Hallo ihr SQL-Profis! :)

Ich möchte eine Abfrage erstellen für die meine aktuellen SQL-Kenntnisse nicht ausreichen. Vielleicht kann mir ja hier jemand helfen.

Zur Ausgangslage:

1. Es gibt eine Tabelle mit Aufträgen in der Artikelnummer und Kundenummer steht mit mehreren Positionen.
Auftrag 123 ... Pos 1 ... Artikel 4422 .... Kunde 4711
Auftrag 123 ... Pos 2 ... Artikel 5567 .... Kunde 4711
Auftrag 123 ... Pos 3 ... Artikel 5643 .... Kunde 4711

2. Es gibt eine Tabelle in der Artikelinformationen stehen die Abhängig von Kunde und Artikel sind. In der Tabelle gibt es auch ein Feld Artikelnummer und Kundennummer.
Kunde 2000 ... Artikel 4422 ... Besonderheit grün
Kunde 2000 ... Artikel 5567 ... Besonderheit blau
Kunde 2000 ... Artikel 5643 ... Besonderheit rot

Kunde 4711 ... Artikel 4422 ... Besonderheit schwarz
Kunde 4711 ... Artikel 5567 ... Besonderheit braun

Es gibt also für alle Artikel Standardwerte unter der Kundennummer 2000 und für ein paar Artikel Kundenspezifische Werte unter der entsprechenden Kundennummer (Beispielsweise 4711).

Jetzt das Problem:

Die Abfage soll mir alle Positionen der Auftragsnummer 123 liefern. Das ganze mit der Besonderheit aus der zweiten Tabelle. Das Problem ist wenn unter dem Artikel und Kunden nichts angelegt ist (wie hier im Beispiel bei Artikel 5643) soll die Abfrage den Standardwert liefern.

Wunschergebniss der Abfrage:
Artikel 4422 ... Besonderheit schwarz
Artikel 5567 ... Besonderheit braun
Artikel 5643 ... Besonderheit rot

Ich bekomme es leider nicht hin. Ich habe schon mit IF rumexperimentiert aber das hat alles nicht hingehauen. Kann mir von euch jemand helfen?
Das wäre echt super :). Gibts vielleicht die möglich die Kundennummer in der Abfrage variable zu gestalten? Das für jeden Datensatz geprüft wird: ist vorhanden dann 4711 ansonsten 2000.

mfg David
 
wenn wir schon mal SQL durch die gegend schicken, hier nun mein senf :-D
SQL:
SELECT kunde, artikelnummer,
   CASE  
     WHEN besonderheit IS NOT NULL THEN
         besonderheit
     ELSE
        (SELECT Standarwert FROM Deine_Standardwerte xy WHERE xy.artikelid = a.artikelid)
    END CASE as Besonderheit_neu
 FROM Auftrag a INNER JOIN Artikelinformationen i
  ON a.id = i.auftrags_id
WHERE a.id = 123
 
Hallo gorefest!

Vielen Dank für deine Antwort :).

Es handelt sich um eine MS SQL 2008 DB.

Deine Abfrage sieht gefühlsmäßig sehr vielversprechend aus aber ich hab es für mein kongretes Projekt noch nicht zum laufen gebracht.

Kannst du es bitte nochmal mit den richtigen Tabellen und Feldnamen posten?

Hier mal beispielhaft die Tabellen- und Feldnamen

Tabellen:

Tabelle mit Aufträgen: Aufträge
Tabelle mit Artikelinfos: Artikelinfos

Felder:
Auftragsnummer
Artikelnummer
Kundennummer
Besonderheit

In der Tabelle Artikelinfos stehen sowohl die Standardwerte als auch die speziellen für den Kunden einziger unterschied die Kundennummer ist bei den Standardwerten immer 2000.

Die Verknüpfung muss doch immer über beide Felder gehen (Artikelnummer und Kundennummer) oder nicht? In deiner Abfrage hast du nur ein Feld oder bin ich jetzt auf dem Holzweg? Warum ist bei dem Join ON die Auftragsnummer angegeben? Die steht doch gar nicht in der Artikelinfo-Tabelle.

Wäre schön wenn du mir nochmal helfen könntest ;)

mfg
David
 
Hallo gorefest!

Es hat sich erledigt ich habe es nach einigen Versuchen geschaft deine Abfrage so umzubauen das für meinen kongreten Fall funktioniert.
Vielen Dank für deinen Lösungsansatz, der hat mir sehr weiter geholfen.

Ist zwar eine mördermäßig große Abfrage geworden aber Sie funktioniert :).
 
Zurück