Delphi-PRAXiS

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.

mkinzler 12. Aug 2007 16:55

Re: SQL Berechnung und NULL
 
Welche Funktion?
Versuch mal
SQL-Code:
...sum(iif( <Feld> is not null, <feld>, 0))...

Werwurm 12. Aug 2007 17:11

Re: SQL Berechnung und NULL
 
Zitat:

Zitat von mkinzler
Welche Funktion?
Versuch mal
SQL-Code:
...sum(iif( <Feld> is not null, &lt;feld&gt;, 0))...

@mkinzler
Ich meine die Funktion SUM. Ich bin der Meinung ich zwei Felder verschiedener Tables nicht über die SUM-Funktion addieren kann.
Mit Deinem Vorschlag sieht meine SQL-Abfrage so aus:
SQL-Code:
SELECT s.name||', '||s.vorname, (iif(e.punkte IS NOT NULL, e.punkte, 0)) + (iif(d.punkte IS NOT NULL, d.punkte, 0)) as punkte
FROM "T_SPIELER" s
LEFT OUTER JOIN "T_EINZEL_ERGEBNIS" e ON e.spieler_id=s.id
LEFT OUTER JOIN "T_DOPPEL_ERGEBNIS" d ON d.spieler_id=s.id and d.liga=e.liga
WHERE (e.spieler_id is NOT NULL) AND (d.spieler_id is NOT NULL);
Dadurch erhalte die Fehlermeldung "Token unknown: is"

mkinzler 12. Aug 2007 17:35

Re: SQL Berechnung und NULL
 
Wenn du Null-Werte im where ausschließt, brauchst du diese nicht mehr mit IIf o.ä. auschließen.
Sum summiert alle werte einer oder mehrerer Spalten.

Werwurm 12. Aug 2007 17:46

Re: SQL Berechnung und NULL
 
Zitat:

Zitat von mkinzler
Wenn du Null-Werte im where ausschließt, brauchst du diese nicht mehr mit IIf o.ä. auschließen.
Sum summiert alle werte einer oder mehrerer Spalten.

Ich glaube ich wurde immer noch nicht verstanden, oder ich bin komplett auf dem Holzweg.
In den beiden Tables habe ich lediglich nur einen Eintrag pro Spieler. Die erspielten Punkten werden schon beim Eintragen durch eine SP addiert.
Ich musste nur aus Abfragegründen die Einzelspiele von den Doppel trennen. Deshalb habe ich zwei Tables mit schon summierten Werten.
Nun möchte ich lediglich die beiden summierten Werte addíeren.

Ich werde die Sache jetzt versuchen mittels Trigger lösen, da ich für mein Problem keine andere Lösung mehr sehe.

mkinzler 12. Aug 2007 17:48

Re: SQL Berechnung und NULL
 
versuch mal
SQL-Code:
...not is null ...

peter12 12. Aug 2007 18:07

Re: SQL Berechnung und NULL
 
Wäre es nicht möglich einen Trigger zu Programmieren der keine Null auf diesen Feld zuläst sonder 0.
Somit wäre das Problem beim addieren verschwunden.

Peter

Werwurm 12. Aug 2007 18:29

Re: SQL Berechnung und NULL
 
Hallo,

habe die Sache mit einem Trigger gelöst.
Sobald ich einen Spieler erzeuge bekommt dieser alle Werte auf 0 gesetzt.
So klappt auch die Addition.

Vielen Dank für Eure Hilfe.

marabu 12. Aug 2007 18:32

Re: SQL Berechnung und NULL
 
Hallo Marcus,

bei mir funktioniert das:

SQL-Code:
/* 
  spieler (id, nachname, vorname)
  einzel (spieler_id, punkte)
  doppel (spieler_id, punkte)
*/

SELECT id, nachname, vorname, (COALESCE(e.punkte, 0) + COALESCE(d.punkte, 0)) AS punkte
FROM spieler s
LEFT JOIN einzel e ON s.id = e.spieler_id
LEFT JOIN doppel d ON s.id = d.spieler_id
Grüße vom marabu

Jelly 12. Aug 2007 18:36

Re: SQL Berechnung und NULL
 
[quote="Werwurm"]Sobald ich einen Spieler erzeuge bekommt dieser alle Werte auf 0 gesetzt.[/default]
Dafür gibts auch Default Werte.
Zitat:

Zitat von Werwurm
So klappt auch die Addition.

Hast du denn schon die Coalesce Funktion ausprobiert, die ich oben genannt habe.

Hansa 12. Aug 2007 18:45

Re: SQL Berechnung und NULL
 
Da hilft eigentlich nur noch der Firebird Null-Guide. Dringend lesen. :mrgreen:

Werwurm 12. Aug 2007 20:44

Re: SQL Berechnung und NULL
 
Zitat:

Zitat von Jelly
Dafür gibts auch Default Werte.

Danke für den Tip. Ich habe Default Werte angelegt. Um den trigger komme ich aber nicht herum um den seperaten Tables einen Eintrag zu erzeugen. Denn Spieler und Ergebnisse sind seperate Tables.


Zitat:

Zitat von Jelly
[Hast du denn schon die Coalesce Funktion ausprobiert, die ich oben genannt habe.

Auch diese Funktion hatte ich versucht. Bekomme aber in IB und in FB jeweils die Fehlermeldung "Function unknown"

Aber wie gesagt, mittels Trigger läuft es wunderbar.

Zitat:

Zitat von Hansa
Da hilft eigentlich nur noch der Firebird Null-Guide. Dringend lesen. :mrgreen:

Diesen habe mir gerade ausgedruckt und werde Ihn heute Nacht unter mein Kopfkissen legen... :lol:

Nochmals vielen Dank! :dp:


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:32 Uhr.

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