PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Wie in SQL NULL durch 0 ersetzen?



Hans-Georg Normann
28-12-2004, 16:02
Diese Finanzdatenbank bringt mich um den Verstand :confused:

Ich habe ein Tabelle Forderungen (RECEIVABLES) und eine Zahlungen (PAYMENTS). Gesucht werden alle Forderungen in Fremdwährung, welche noch nicht ausgeglichen sind. Das ganze kann ich nur mittels Journal festellen, da die Auswertung auch rückwirkend sein muß. Als Datenbank wir Firebird 1.5 eingesetzt.

Das hier läuft schon ganz prächtig:
Select
R.ACCOUNT,
R.DOCUMENT_NO,
SUM(R.RECEIVABLE) RECEI,
SUM(P.PAYMENT) PAYED,
SUM(R.RECEIVABLE) + SUM(P.PAYMENT) OP,
SUM(R.CURR_RECEIVABLE) CURR_RECEI,
SUM(P.PAYMENT * R.EXCHANGE_RATE) CURR_PAYED,
SUM(R.CURR_RECEIVABLE) +
SUM(P.PAYMENT * R.EXCHANGE_RATE) CURR_OP
FROM RECEIVABLES R LEFT OUTER JOIN PAYMENTS P ON (
R.ACCOUNT = P.ACCOUNT
AND R.DOCUMENT_NO = P.DOCUMENT_NO
)
Where R.FINANCIAL_MONTH < 200402
AND R.CURR_NO = 3
GROUP BY R.ACCOUNT, R.DOCUMENT_NOProblem :
Wenn noch keine Zahlungen vorhanden sind, dann erhalte ich bei allen ausgegebenen Sätzen die Funktionen wie SUM(P. irgendwas) enthalten, den Wert NULL. Damit kann ich leider nicht rechnen.

Kann ich SQL irgendwie dazu bringen, statt NULL 0.0 auszugeben? Die letzte Abfragebedingung soll nämlich


HAVING SUM(R.RECEIVABLE) + SUM(P.PAYMENT) <> 0.0 sein.

Hans

shb
28-12-2004, 16:05
warum lässt du null nicht durch 0 ersätzen?
update tabelle set spalte ='0' where spalte like null

cu SHB

Hans-Georg Normann
28-12-2004, 17:05
Dazu müsste ich in der Zahlungstabelle für jede vorhandene Forderung einen dummy Datensatz erzeugen. Das wäre zwar eine Möglichkeit, erzeugt aber m. E. ziemlich viel Ballast.

Hans

Alex_K
28-12-2004, 22:17
ich bin mir nicht sicher ob die funktion im sql standard drinnen ist und ob es sie in firebird gibt, aber mit postresql und oracle funktion das mit der funktion nvl(spalte, 0).

edit: hab gerade nochmals nach geschaut: in postgresql gibt es die funktion doch nicht.

Hans-Georg Normann
28-12-2004, 22:42
Danke, das war genau der richtige Tipp. Das gibt's aber in Firebird scheinbar auch noch nicht. Aber immerhin habe ich jetzt einiges in der Knowledgebase von FB gefunden. Man hat es also bereits zur Kenntnis genommen.


There are NVL functions in fbudf. For strings (CHAR and VARCHAR) you can
use:

select sNVL(f1) || sNVL(f2) from table

However, this functions only exist for Windows, on other platforms you
may search the web for some other UDFs that do this.

Third option is to write the stored procedure which will do the select
and return exactly what you need.Quelle: http://www.ibphoenix.com/archive/main.nfs?a=archive&l=;FB_SUPPORT;ID='1334'

Dann werde ich das wohl über eine Stored Procedure machen müssen.

Hans

Christoph
29-12-2004, 13:00
In PostgreSQL geht das mit CASE oder COALESCE. CASE ist glaube ich SQL2 (oder erst 3?) Standard.