Entwickler-Ecke

Datenbanken - SQL mit IF Abfrage


WEBSTER - Di 10.01.06 01:20
Titel: SQL mit IF Abfrage
Salute,

ich möchte folgenden SQL mit einer IF Abfrage laufen lassen. Leider kommt es zu einer Fehlermeldung:

Invalid token.
Dynamic SQL Error.
SQL error code = -104.
Token unknown - line 2, char 1.
if.



SQL-Anweisung
1:
2:
3:
4:
5:
6:
7:
8:
9:
select  v.anrede,v.vorname,v.name,
if (g.bei_absage is nullthen absagen = 1 else absagen = 0,
Sum(G.VERMITTLUNGSBETRAG) as summen
from geschaefte g
INNER JOIN vermittler v ON (g.vermittler_nr_1 = v.vermittler_nr) where
erfassungdat between '01.01.2005' and '31.01.2006' and
substring(Vermittler_Nr_1 FROM 1 for 2) = '10' and
substring(Vermittler_Nr_1 FROM 4 for 2) = '10'
group by  v.anrede,v.vorname,v.name,absagen


Das Ergebniss des SQLs sollte so aussehen:


Quelltext
1:
2:
3:
4:
5:
6:
Herr    Peter    Maier      0        100000
Herr    Peter    Maier      1        32000
Herr    Paul     Maier      0        16000
Herr    Paul     Maier      1        356000
Herr    Peter    Weber      0        10450000
Herr    Peter    Weber      1        32004350


Im Augenblick scheitert es an der IF Abfrage. Aber der SQL ist doch sonst ok, oder?

Eigentlich hätte ich aber auch noch eine dritte "Gruppenzeile" und zwar die Summe dersplate Summen. So etwa:


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
Herr    Peter    Maier      0        100000
Herr    Peter    Maier      1        32000
Herr    Peter    Maier               132000
Herr    Paul     Maier      0        16000
Herr    Paul     Maier      1        356000
Herr    Paul     Maier               373000
Herr    Peter    Weber      0        10450000
Herr    Peter    Weber      1        32004350
Herr    Peter    Weber               42454350



Aber wie...?

Bitte um Hilfe..

THX
WEBSTER


alex517 - Di 10.01.06 09:31

Hallo Webster,

Verwende statt IF die CASE Anweisung.
Das würde deiner IF-Anweisung entsprechen:

SQL-Anweisung
1:
2:
3:
..,
CASE WHEN g.bei_absage IS NULL THEN 0 ELSE 1 END as absagen
...

Welche Werte kann eigentlich g.bei_absage haben? Wenn g.bei_absage = 0 sein kann,
würde die Anweisung zu einem fehlerhaften Ergebnis führen, da 0 <> NULL und damit absagen:=1.
Die CASE müsste also ein wenig ausgebaut werden.

Wenn man davon ausgehen kann, dass "g.bei_absage" die Werte NULL, 0 oder 1 haben kann geht es auch so:

SQL-Anweisung
1:
2:
3:
..,
COALESCE(g.bei_absage, 0as absagen,
...

Als Ergebnis wird der erste Wert der nicht NULL ist zurückgegeben.

alex