Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Prism SQL Berechnung und NULL (https://www.delphipraxis.net/97532-sql-berechnung-und-null.html)

Werwurm 12. Aug 2007 11:41

Datenbank: Interbase • Version: 6.5 • Zugriff über: Interbase Komponenten

SQL Berechnung und NULL
 
Hallo,

habe mal wieder ein Problem,
ich versuche eine Summen Berechnung in SQL hinzubekommen.
Das klappt auch, jedoch müssen alle addierten Felder einen Wert haben.
Bei einem NULL Wert ist das gesamte Ergebnis NULL.

Nun habe ich gegoogelt und auch hier geschaut.
Folgendes habe ich gefunden:
SQL Berechnung mit NULL

Gibt es so eine Funktion wie ISNULL auch für Interbase?

mkinzler 12. Aug 2007 11:43

Re: SQL Berechnung und NULL
 
Schließe die Null-Werte bei der Summierung doch aus

SQL-Code:
...Sum( case when <Feld> is not null then <Feld> else 0 end) ...

grenzgaenger 12. Aug 2007 11:54

Re: SQL Berechnung und NULL
 
oder eben in der where clausel

SQL-Code:
where feld is not null

Werwurm 12. Aug 2007 13:08

Re: SQL Berechnung und NULL
 
Hallo,

ist schon schlecht wenn die Finger langsamer als der Kopf, dann bleibt die Beschreibung auf der Strecke.
Hier nun genauer:
Ich schreibe gerade eine Mannschaftsverwaltung für unsere Dartmannschaft. Dort trage ich auch die Spielergebnisse ein.
Hierfür habe ich zwei Tables "gespielte Einzel" und "gespielte Doppel".
Pro Spieler gibt es einen Eintrag, in dem die Ergenisse addiert werden.
In beiden Tables gibt es u.a. das Feld Punkte.
Nun möchte möchte ich für die ewigen Bestenliste die erspielten Punkte addieren.
Das mache ich nicht über die SUM Funktion sondern mittels
SQL-Code:
einzel.punkte+doppel.punkte
Ein Zusammenlegen der Tables macht aufgrund der restlichen DB-Struktur keinen Sinn.
So weit so schwer.
Nun gibt es Spieler die haben noch nie Einzel bzw. Doppel gespielt haben. Somit ist noch ein NULL Wert vorhanden. Und das verwirft das Ergebnis.

Zitat:

Schließe die Null-Werte bei der Summierung doch aus
SQL-Code:
...Sum( case when <Feld> is not null then <Feld> else 0 end) ...

Habe ich nicht hinbekommen, da Interbase eine Fehlermeldung "WHEN Unbekannt" bringt.
Meine vereinfachtes SQL Statement sieht folgendermaßen aus:

SQL-Code:
SELECT s.name||', '||s.vorname, e.punkte + d.punkte FROM "T_SPIELER" s
LEFT OUTER JOIN "V_EINZEL_ERGEBNIS" e ON e.spieler_id=s.id
LEFT OUTER JOIN "V_DOPPEL_ERGEBNIS" d ON d.spieler_id=s.id and d.liga=e.liga
WHERE (e.spieler_id is NOT NULL) AND (e.spieler_id is NOT NULL);

Zitat:

oder eben in der where clausel
SQL-Code:
where feld is not null

Kann nicht angewandt werden, da ich die NULL Werte behandeln möchte.

Weiß noch jemand eine Lösung für mein Problem?
Eine SP scheidet aus, da ich die Liste über alle Spieler und somit mehrere Records erhalten möchte

mkinzler 12. Aug 2007 13:26

Re: SQL Berechnung und NULL
 
Schon mal mit FB versucht, dort ist case when oder IIf bekannt

Werwurm 12. Aug 2007 14:04

Re: SQL Berechnung und NULL
 
Zitat:

Schon mal mit FB versucht, dort ist case when oder IIf bekannt
Ich habe den Umstieg schon mal versucht, jedoch habe ich es nicht geschafft vernünftig auf die DB zuzugreifen.
Eigentlich sollte das ja auch mit der IBConsole gehen und das habe ich nicht hinbekommen.
Und auf reiner Befehlszeilenbasis ist mir das nicht komfortabel genug.
Muss aber dazu sagen, das ich lediglich einen Abend Zeit investiert habe. Und die anderen gefunden Management-Tools alle kostenpflichtig waren.

Vielleicht sollte ich mich nochmals mit dem Thema auseinander setzen.

Bin für jeden weiteren Tip (auch für den Umstieg) dankbar.

Jelly 12. Aug 2007 14:04

Re: SQL Berechnung und NULL
 
Zitat:

Zitat von Werwurm
SQL-Code:
SELECT s.name||', '||s.vorname, e.punkte + d.punkte FROM "T_SPIELER" s
LEFT OUTER JOIN "V_EINZEL_ERGEBNIS" e ON e.spieler_id=s.id
LEFT OUTER JOIN "V_DOPPEL_ERGEBNIS" d ON d.spieler_id=s.id and d.liga=e.liga
WHERE (e.spieler_id is NOT NULL) AND (e.spieler_id is NOT NULL);

Warum machst du einen left outer join, und filterst die NULL Ergebnisse wieder weg. Mach doch lieber gleich ein inner join.

Zu deinem Problem... Probiers mal so:
SQL-Code:
select sum(coalesce(Punkte,0)) from ...

marabu 12. Aug 2007 14:25

Re: SQL Berechnung und NULL
 
Hallo,

Zitat:

Zitat von Werwurm
... Gibt es so eine Funktion wie ISNULL auch für Interbase? ...

so manche in Interbase fehlende Funktionalität lässt sich über UDF-Libraries nachrüsten, so auch IsNull(). Wenn du aber nicht auf eine neuere Interbase-Version umsteigen möchtest, weil diese dich finanziell zu sehr belasten würde, dann ist FireBird wirklich eine Alternative. Das Hilfsprogramm IBConsole gibt es in einer speziell für FireBird angepassten Version, wenn ich mich recht erinnere, aber du solltest dir unbedingt mal IBExpert ansehen.

Grüße vom marabu

grenzgaenger 12. Aug 2007 16:24

Re: SQL Berechnung und NULL
 
aber sag mal, weshalb willste denn die sätze mit berechen, für welche keine ergebnisse vorliegen :gruebel: :gruebel: :gruebel: :gruebel: ausserdem, erhöht sich ja dein punktewert ja dadurch nicht... wenn nicht gespielt wurde... also, was spricht gegen den ausschluss von NULL's ???
dein statement könnte dann in etwa wie folgt lauten:

SQL-Code:
SELECT s.name||', '||s.vorname, e.punkte + d.punkte FROM "T_SPIELER" s
LEFT OUTER JOIN "V_EINZEL_ERGEBNIS" e ON e.spieler_id=s.id
LEFT OUTER JOIN "V_DOPPEL_ERGEBNIS" d ON d.spieler_id=s.id and d.liga=e.liga
WHERE (d.punkte is NOT NULL) AND (e.punkte is NOT NULL);
ps: in deinen sql statement hattest du 'n fehler, du hast beide mal auf e.id is null geprüft und nicht einmal auf e.... und d...

Werwurm 12. Aug 2007 16:53

Re: SQL Berechnung und NULL
 
Hallo,

ich habe mir nun FB2.0 installiert die DB soweit auch konvertiert.
Als Anwendung habe ich nun IBExpert.

Das beschriebene Problem besteht aber immer noch.
Keiner zahlreichen Tips hat funktioniert, immer bekomme ich die Fehlermeldung "procdure unknown"

Ich weiß ob ich so vernagelt bin, aber alle Tips galten der SUM-Funktion. Diese kann ich aber nicht nutzen (denke ich) da ich zwei Felder aus verschiedenen Tables addieren möchte.

Zitat:

Zitat von Jelly
Warum machst du einen left outer join, und filterst die NULL Ergebnisse wieder weg. Mach doch lieber gleich ein inner join.

Die Sache mit dem left outer Join. Ich brauche alle Spieler Ergebnisse und die dazugehörigen Namen.
Deshalb frage ich die tabelle "T_SPIELER" ab. Der Left Outer Join sorg dafür das alle Daten der anderen Tables mit zugeordnet werden.
Leider gibt es aber auch Spieler, die weder Einzel noch Doppel gespielt haben. Diese filtere ich mit der WHERE Klausel wieder raus.

Anders habe ich nie das Ergebnis so erhalten, wie es am ehesten meiner Vorstellung entspricht.
Vielleicht mache ich es mir auch wieder umständlicher als es sein müsste, das wäre nichts neues...

Zitat:

Zitat von grenzgaenger
aber sag mal, weshalb willste denn die sätze mit berechen, für welche keine ergebnisse vorliegen ausserdem, erhöht sich ja dein punktewert ja dadurch nicht... wenn nicht gespielt wurde... also, was spricht gegen den ausschluss von NULL's ???

Ich habe in beiden Tables jeweils nur einen Eintrag pro Spieler. Nun gibt es halt Spieler wo einer der beiden Einträge noch fehlt, da noch keine Einzel bzw. Doppel gespielt wurden.
Somit liegen mir NULL Werte vor. Wie beschrieben soll ich eine absolute Statistik liefern, die die erspielten Punkte als einen Wert anzeigt. Somit muss ich die jeweiligen Felder der beiden Tables addieren.
Ich hatte auch schon überlegt, mittels Trigger die Werte im Table anzupassen. Sodass immer beide Tables Werte für den Spieler liefern.
Das finde ich aber nicht als die sauberste Variante.


Zitat:

Zitat von grenzgaenger
ps: in deinen sql statement hattest du 'n fehler, du hast beide mal auf e.id is null geprüft und nicht einmal auf e.... und d...

Danke für den Hinweis, war sogar schon korrigiert. Hatte das SQL-Statement aus ner Skript-Datei geladen, die nicht ganz aktuell war.
In arbeite nicht auch nicht mehr mit den Views sondern mit Tables.


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:48 Uhr.
Seite 1 von 3  1 23      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz