Mipe: SQL-Befehl IF?

Hallo, ich will in SQL eine Abfrage formulieren, die ungefähr folgendes enthalten soll:

---
Select Bezeichnung, Stück, Preis, Rabatt, (Stück*Preis) AS Gesamt_NoRabatt, (Preis/100*(100-Rabatt)*Stück) AS Gesamt_Rabatt FROM ...
---

Mein Problem ist jetzt, daß das Feld Rabatt teilweise NULL-Werte enthält. Deswegen wird natürlich in Gesamt_Rabatt auch NULL dargestellt, obwohl hier dann dasselbe wie in Gesamt_NoRabatt erscheinen soll.

Ich hab schon probiert das ganze in eine IF-Anweisung zu packen, aber es klappt einfach nicht.

Könnt ihr mir vielleicht weiterhelfen, daß wenn kein Rabatt vorhanden ist, er als Gesamt_Rabatt dasselbe anzeigt wie in Gesamt_NoRabatt?

Ich wäre euch sehr dankbar,
Mipe

  1. Moin!

    Könnt ihr mir vielleicht weiterhelfen, daß wenn kein Rabatt vorhanden ist, er als Gesamt_Rabatt dasselbe anzeigt wie in Gesamt_NoRabatt?

    Logisch: Setze in alle Felder, in denen NULL steht, die Zahl 0 ein - dann hast du diese Ausnahmebehandlung nicht mehr. Dann solltest du noch die Tabellendefinition dieser Rabattspalte auf "not_null" setzen, und den Standardwert ebenfalls auf "0" setzen, damit dir keine NULL-Werte mehr in die Datenbank kommen.

    Die Ursache deines Problems ist schlicht ein mangelhaftes Datenmodell. :)

    - Sven Rautenberg

    --
    "Bei einer Geschichte gibt es immer vier Seiten: Deine Seite, ihre Seite, die Wahrheit und das, was wirklich passiert ist." (Rousseau)
    1. Und mal davon ausgehend, daß ich an der Datenbankstruktur an sich nichts verändern möchte?

      Ich mein, es gibt doch eine IF-Anweisung und es könnte ja auch sein, daß jeder, der unter 5% Rabatt hat, auch den Gesamt_NoRabatt-Wert bekommen soll.

      Mipe

    2. Hallo Mipe,

      Alternativen zur Lösung von Sven (d.h. wenn keine DB-Strukturänderungen möglich sind) hängen von der DB ab.
      Bei Oracle gibt es die Funktion NVL, bei MySQL die Funktion
      IFNULL beide haben 2 Parameter; für andere DBs weiß ich nicht (Access hat m.E. sowas nicht). Wenn der erste Parameter = NULL, dann wird der Wert des zweiten zurückgeliefert, ansonsten der erste.

      Gruß Ralf

      1. Vielen Dank Ralf... ISNULL() war exakt das, was ich gesucht habe. Jetzt funktioniert es einwandfrei

        Mipe

      2. Hallo Ralf,

        Bei Oracle gibt es die Funktion NVL, bei MySQL die Funktion
        IFNULL beide haben 2 Parameter; für andere DBs weiß ich nicht (Access hat m.E. sowas nicht).

        Warum nicht?

        SELECT Preis, Menge, Rabatt, IIf([rabatt] Is Null,0,[rabatt]) AS NumRabatt, [Preis]*[Menge] AS Ges1, [Preis]*(100-[NumRabatt])/100*[Menge] AS Ges2 FROM Tabelle2

        Was habt Ihr nur alle gegen ACCESS? Nur weil man etwas nicht kennt, muss es noch nicht schlecht sein. Und wie war das noch mit dem berühmten Zitat von Dieter Nuhr ... ;-))

        viele Grüße

        Axel