SQL oracle datenbank when then else

hi wollte mich erst mal vorstellen, habe nen neuen job und nun auch die aufgabe bekommen die sql datenbank zu betreuen und zu bearbeiten, deshalb auch mein kürzel dau, aber ich hoffe das sich das bald ändert…

mein proplem:

CASE
WHEN
SUM(cdn_total.value) IS NOT NULL
AND SUM(skill_ansd.value) IS NOT NULL
AND SUM(skill_ansd.value) > 0
THEN SUM(total_calls.value) / SUM(cdn_total.value) * 100
ELSE 0
END value
kann ich bei diesem teil nach dem else eine 100 einstzen um das wenn alle bedingungen nicht zutreffen das in der tabelle bei der ausgabe eine 100 ausgegeben wird, hatte es versucht aber es wird immer eine leere zeile zurück gegeben obwohl ich 100 nach dem else eingesetzt habe…was mache ich falsch

danke im vorraus

Wenn Du mit AND arbeitest, kommt der ELSE-Teil, wenn auch nur eine Bedingung nicht zuftrifft. Ansonsten kann ich weder erkennen, warum da eine leere Zeile kommen sollte noch warum das mit der 100 nicht gehen sollte.

Kann es sein, daß Dein Statement aber irknwie kapott ist? Du prüfst Werte, die in der Formel nicht vorkommen. Aber vielleicht ist das ja auch so gewollt. Aber ich vermute mal, Dein SUM(total_calls.value) liefert NULL und daher ist das Resultat dann auch NULL, oder, wie Du schreibst, eine leere Zeile.

Andreas

also hier mal der komplette teil:

WITH h AS (# :p ivot_table:#)
SELECT
:field_id field_id,
h.date_time,
CASE
WHEN
SUM(cdn_total.value) IS NOT NULL
AND SUM(skill_ansd.value) IS NOT NULL
AND SUM(skill_ansd.value) > 0
THEN SUM(total_calls.value) / SUM(cdn_total.value) * 100
ELSE 0
END value
/*
,
SUM(cdn_total.value) “CDNtotal”,
SUM(skill_ansd.value) “skillAnswd”,
SUM(total_calls.value) “TotCalls”
*/
FROM rep_value_#:interval:# total_calls
FULL JOIN rep_value_#:interval:# cdn_total ON total_calls.date_time = cdn_total.date_time
FULL JOIN rep_value_#:interval:# skill_ansd ON total_calls.date_time = skill_ansd.date_time
INNER JOIN h ON total_calls.date_time BETWEEN h.date_time AND #:date_time_window:#
AND cdn_total.date_time BETWEEN h.date_time AND #:date_time_window:#
AND total_calls.field_id = (SELECT id FROM rep_field WHERE name = ‘total_calls’)
AND cdn_total.field_id = (SELECT id FROM rep_field WHERE name = ‘cdn_total’)
AND skill_ansd.field_id = (SELECT id FROM rep_field WHERE name = ‘telrep_sc_skill_ans’)
GROUP BY h.date_time

es handelt sich um eine telefonanlagendatenbank und wenn einer der werte 0 ist soll er 100 bringen, ansonsten funktioniert die rechnung und er gibt immer zahlen aus…z.b. wird sonntags bei uns nicht telefoniert und dann soll 100 % angezeigt werden ich dachte das geht wenn ich nach dem else ne hundert eingebe, leider ist dem nicht so, ansonsten funktioniert es anstatt der gewollten hundert gibt er dort nichts aus, wahrscheinlich weil hinter dem else ne null steht, aber müsste er nicht dann ne hundert aus´geben wenn ich hinter dem else ne hundert eintrage???

Noch einmal: ich vermute, daß der ELSE-Teil nicht erreicht wird. Ich versteh auch grad Deine Vermutung nicht, daß er bei 0 eine leere Zeile und bei 100 dann 100 ausgeben soll. Außerdem scheint das kein PostgreSQL zu sein, vermutlich ORA.

test=*# select 0/5;
 ?column?
----------
        0
(1 row)

test=*# select NULL/5;
 ?column?
----------

(1 row)

test=*# select 100/5;
 ?column?
----------
       20

Beachte den Unterschied zwischen 0 und NULL…


Andreas

ja das ist oracle, hatte ich in die betreffzeile geschrieben…

ja nach deinem beispiel müsste es ja dann 100 ausgeben wenn eines der 3 dinge nicht erfüllt ist, und das macht es leider nicht, sieht so aus als ob er das else ignoriert egal ob ich das else 0 oder 100 eingebe oder das else ganz weglasse, gibt es kein unterschied…
aber ich danke dir erstmal für deine hilfe

Auch wenn z.B. das Commandline-Tool von Oracle IMHO nur als Füllmasse für Mülltonnen taugt, bezweifle ich doch, daß bei Oracle das CASE… derart kapott ist und Du der erste sein solltest, dem das auffällt.

Andreas