AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Prism SQL Berechnung und NULL
Thema durchsuchen
Ansicht
Themen-Optionen

SQL Berechnung und NULL

Ein Thema von Werwurm · begonnen am 12. Aug 2007 · letzter Beitrag vom 12. Aug 2007
Antwort Antwort
Seite 1 von 3  1 23      
Werwurm

Registriert seit: 21. Apr 2003
Ort: Bremen
71 Beiträge
 
Delphi 2009 Professional
 
#1

SQL Berechnung und NULL

  Alt 12. Aug 2007, 12:41
Datenbank: Interbase • Version: 6.5 • Zugriff über: Interbase Komponenten
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?
Gruß
Marcus
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: SQL Berechnung und NULL

  Alt 12. Aug 2007, 12:43
Schließe die Null-Werte bei der Summierung doch aus

...Sum( case when <Feld> is not null then <Feld> else 0 end) ...
Markus Kinzler
  Mit Zitat antworten Zitat
grenzgaenger
(Gast)

n/a Beiträge
 
#3

Re: SQL Berechnung und NULL

  Alt 12. Aug 2007, 12:54
oder eben in der where clausel

where feld is not null
  Mit Zitat antworten Zitat
Werwurm

Registriert seit: 21. Apr 2003
Ort: Bremen
71 Beiträge
 
Delphi 2009 Professional
 
#4

Re: SQL Berechnung und NULL

  Alt 12. Aug 2007, 14:08
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 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
...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
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
Gruß
Marcus
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#5

Re: SQL Berechnung und NULL

  Alt 12. Aug 2007, 14:26
Schon mal mit FB versucht, dort ist case when oder IIf bekannt
Markus Kinzler
  Mit Zitat antworten Zitat
Werwurm

Registriert seit: 21. Apr 2003
Ort: Bremen
71 Beiträge
 
Delphi 2009 Professional
 
#6

Re: SQL Berechnung und NULL

  Alt 12. Aug 2007, 15:04
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.
Gruß
Marcus
  Mit Zitat antworten Zitat
Benutzerbild von Jelly
Jelly

Registriert seit: 11. Apr 2003
Ort: Moestroff (Luxemburg)
3.741 Beiträge
 
Delphi 2007 Professional
 
#7

Re: SQL Berechnung und NULL

  Alt 12. Aug 2007, 15:04
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:
select sum(coalesce(Punkte,0)) from ...
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#8

Re: SQL Berechnung und NULL

  Alt 12. Aug 2007, 15:25
Hallo,

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
  Mit Zitat antworten Zitat
grenzgaenger
(Gast)

n/a Beiträge
 
#9

Re: SQL Berechnung und NULL

  Alt 12. Aug 2007, 17:24
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 ???
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...
  Mit Zitat antworten Zitat
Werwurm

Registriert seit: 21. Apr 2003
Ort: Bremen
71 Beiträge
 
Delphi 2009 Professional
 
#10

Re: SQL Berechnung und NULL

  Alt 12. Aug 2007, 17:53
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 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 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 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.
Gruß
Marcus
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:40 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