Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Bitte Hilfe für SQL-Abfrage (https://www.delphipraxis.net/117756-bitte-hilfe-fuer-sql-abfrage.html)

Privateer3000 24. Jul 2008 09:22

Datenbank: MDB • Zugriff über: ADO

Bitte Hilfe für SQL-Abfrage
 
Hallöchen,
ich häng fest mit einer eigentlich simplen Sache:
Tabelle A: Punkte (journal)
Tabelle B: Spieler (spnamen)

nun sollen alle Spieler aus A mit Spieler aus B
verglichen und Punkte summiert werden.
Wenn Punkte vorhanden sind Punkte anzeigen, wenn nicht
null anzeigen. D.h. es sollen also alle angezeigt werden
ob nun Punkte da sind oder nicht.
Delphi-Quellcode:
with refti do begin
  Close; SQL.Clear;
  SQL.Text:='SELECT A.id,sum(A.versuche*A.punkte) as pualles FROM journal'+
            ' AS A INNER JOIN spnamen AS B ON A.id=B.id'+
            ' WHERE A.validiert=False'+
            ' GROUP BY A.id';
  Open;First;
  end;
  while not refti.Eof do begin
    with haupt.plane.sppanel1.FindComponent('splab'+refti.fieldbyname('id').AsString)as TLabel do begin
     Caption:=format('%f',[refti.FieldByName('pualles').AsFloat])
  refti.Next;
  end;
Nun zm Problem. An sich funktioniert das.
Doch wenn A.validiert auf True gesetzt wurde und o.g.
Abfrage erneut gestartet wird, werden die Punkte immer noch angezeigt.
D.h. wahrscheinlich nicht abgefragt und die Ergebnisse bleiben stehen.

Ich hoffe jemand blickt hier durch... :-(

LG
Privateer

DeddyH 24. Jul 2008 09:37

Re: Bitte Hilfe für SQL-Abfrage
 
In B stehen die Spieler und in A die Punkte? Und Du willst alle Spieler sehen?

Privateer3000 24. Jul 2008 10:04

Re: Bitte Hilfe für SQL-Abfrage
 
exacto del mundo

DeddyH 24. Jul 2008 10:09

Re: Bitte Hilfe für SQL-Abfrage
 
Möglicherweise ist das mal wieder kompletter Blödsinn (:mrgreen:), aber versuch es mal so:
SQL-Code:
SELECT B.ID, (CASE A.ID WHEN NULL THEN 0 ELSE SUM(A.versuche*A.punkte) END) AS pualles
FROM spnamen B
LEFT JOIN journal A ON A.ID = B.ID
WHERE A.validiert = False
GROUP BY B.ID

Privateer3000 24. Jul 2008 10:37

Re: Bitte Hilfe für SQL-Abfrage
 
Case in einem SQL-String?

mkinzler 24. Jul 2008 10:39

Re: Bitte Hilfe für SQL-Abfrage
 
Wenn das DBMS dies unterstützt, sonst halt IIF(), IF() o.ä

Privateer3000 24. Jul 2008 11:07

Re: Bitte Hilfe für SQL-Abfrage
 
[quote="DeddyH"]
SQL-Code:
SELECT B.ID, sum(IIF(A.ID >0,A.versuche*A.punkte,0)) AS pualles
FROM spnamen B
LEFT JOIN journal A ON A.ID = B.ID
WHERE A.validiert = False
GROUP BY B.ID
Es funktioniert zwar, aber der Effekt bleibt gleich....

DeddyH 24. Jul 2008 11:09

Re: Bitte Hilfe für SQL-Abfrage
 
Mal anders formuliert:
SQL-Code:
SELECT B.ID, sum(IIF(A.ID >0,A.versuche*A.punkte,0)) AS pualles
FROM spnamen B
LEFT JOIN journal A ON A.ID = B.ID
AND A.validiert = False
GROUP BY B.ID

mkinzler 24. Jul 2008 11:11

Re: Bitte Hilfe für SQL-Abfrage
 
NULL ist was anderes als 0

DeddyH 24. Jul 2008 11:13

Re: Bitte Hilfe für SQL-Abfrage
 
Stimmt, hatte ich ganz übersehen :oops:

Privateer3000 24. Jul 2008 11:15

Re: Bitte Hilfe für SQL-Abfrage
 
Mit
SQL-Code:
A.ID > Null
werden garkene Punkte angezeigt

mkinzler 24. Jul 2008 11:15

Re: Bitte Hilfe für SQL-Abfrage
 
Kennt Access NullIf()?
[Edit:
Zitat:

SQL-Code:
 A.ID > Null

du musst auch auf nicht NULL überprüfen]

DeddyH 24. Jul 2008 11:16

Re: Bitte Hilfe für SQL-Abfrage
 
Zitat:

SQL-Code:
A.ID > Null

Das heißt ja auch
SQL-Code:
A.ID IS NOT NULL

mkinzler 24. Jul 2008 11:20

Re: Bitte Hilfe für SQL-Abfrage
 
Ich habe die Funktion ISNULL() gefunden

nahpets 24. Jul 2008 11:21

Re: Bitte Hilfe für SQL-Abfrage
 
Hallo,

in welcher Form sind denn True und False in der Datenbank abgelegt?

Als boolescher Wert oder als Integer (0 = false, 1 = true).
Was steht in der Datenbank, wenn weder false noch true gespeichert wurden? (NULL, (also keine Eingabe?) wird bei Deiner Abfrage nicht gefunden.)

Wie wäre es zuerst mal mit 'nem

SQL-Code:
select count(*) as Anzahl, validiert from A group by validiert
um herauszubekommen, welche Werte denn überhaupt vorhanden sind.

Ist validiert erstmal nicht belegt und daher Null und wird erst beim Validieren auf true gesetzt?
Dann könnte
SQL-Code:
a.validiert <> true
helfen.

Stephan

mkinzler 24. Jul 2008 11:23

Re: Bitte Hilfe für SQL-Abfrage
 
SQL-Code:
a.validiert <> true
Dann doch besser
SQL-Code:
not a.validiert

Privateer3000 24. Jul 2008 11:24

Re: Bitte Hilfe für SQL-Abfrage
 
Ich denke dass er deshalb die Tabelle spnamen nicht durchläuft
da die Bedingungen nicht stimmen.

nahpets 24. Jul 2008 11:32

Re: Bitte Hilfe für SQL-Abfrage
 
Was kommt dabei raus?

SQL-Code:
select count(*) as Anzahl, validiert from A group by validiert
2 oder 3 Zeilen? (die ominöse dritte von zwei Möglichkeiten?)

Hat validiert in der Datenbank einen Defaultwert, der beim Einfügen eines neuen Satzes gesetzt wird, wenn nein, mach das mal, damit Du definiert entweder true oder false in der Datenbank hast, danach sollte Deine Abfrage funktionieren.

Setzte im Zweifelsfalle validiert mal mit

SQL-Code:
update journal set validiert = false where validiert not is null
damit Du nur noch die zwei Werte hast.

Stephan

Privateer3000 24. Jul 2008 11:43

Re: Bitte Hilfe für SQL-Abfrage
 
Diese Bedingung stimmt IMHO
es läuft nur nicht so ab wie es soll:
es MÜSSEN alle in spname Einträge durchlaufen werde
und "nebenbei" gucken ob es Punktesummen dazu gibt.
Denn die Ergebniss SOLLEN ja angezeigt, ob nun 0 oder nicht.
Das heisst im Dataset sollen alle stehen
im anschliessenden "while not eof" des Sets
werden alle Anzeigen aktualisiert.

nahpets 24. Jul 2008 11:50

Re: Bitte Hilfe für SQL-Abfrage
 
Theoretisch hast Du ja recht, aber da es nicht funktioniert, muss ja irgendwas nicht stimmen.
Bitte beantworte meine Fragen, eventuell kommen wir dem Problem ja dann auf die Spur.

Stephan

Privateer3000 24. Jul 2008 12:10

Re: Bitte Hilfe für SQL-Abfrage
 
Ich habs
:
SQL-Code:
SELECT B.ID, sum(IIF(A.validiert=False,A.versuche*A.punkte,0)) AS pualles
FROM spnamen B
RIGHT OUTER journal A ON A.ID = B.ID
GROUP BY B.ID
so funktioniert es,
es werden nullen geschrieben wenn zwar spieler exisitiert
aber keine punkte hat und umgekehrt

DANK AN ALLE !!!

mkinzler 24. Jul 2008 12:12

Re: Bitte Hilfe für SQL-Abfrage
 
Wie erwähnt besser not statt =False

omata 24. Jul 2008 12:13

Re: Bitte Hilfe für SQL-Abfrage
 
Schön das du eine Lösung hast. Aber wieso so kompliziert?
SQL-Code:
SELECT A.*, summe
FROM spnamen A
LEFT JOIN (SELECT id, SUM(versuche * punkte) AS summe
           FROM journal
           WHERE validiert = False
           GROUP BY id) B
  ON A.ID = B.ID
GROUP BY A.ID
Und bitte rede im Zusammenhang mit Datenbanken nicht von "durchläuft" da bekommt man ja Magenschmerzen.

Privateer3000 24. Jul 2008 12:19

Re: Bitte Hilfe für SQL-Abfrage
 
Zitat:

Zitat von omata
Und bitte rede im Zusammenhang mit Datenbanken nicht von "durchläuft" da bekommt man ja Magenschmerzen.

Tschuldigung, dass ich eben es ordinär ausdrücke, aber ihr wißt doch was gemeint ist...

Privateer3000 24. Jul 2008 12:22

Re: Bitte Hilfe für SQL-Abfrage
 
Zitat:

Zitat von mkinzler
Wie erwähnt besser not statt =False

wie meinst das?
SQL-Code:
a.validiert not Null

DeddyH 24. Jul 2008 12:24

Re: Bitte Hilfe für SQL-Abfrage
 
Wohl eher
SQL-Code:
not A.Validiert

Privateer3000 24. Jul 2008 12:28

Re: Bitte Hilfe für SQL-Abfrage
 
alles klar, diese Art kannte ich noch nicht...


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:38 Uhr.

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