![]() |
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:
Nun zm Problem. An sich funktioniert das.
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; 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 |
Re: Bitte Hilfe für SQL-Abfrage
In B stehen die Spieler und in A die Punkte? Und Du willst alle Spieler sehen?
|
Re: Bitte Hilfe für SQL-Abfrage
exacto del mundo
|
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 |
Re: Bitte Hilfe für SQL-Abfrage
Case in einem SQL-String?
|
Re: Bitte Hilfe für SQL-Abfrage
Wenn das DBMS dies unterstützt, sonst halt IIF(), IF() o.ä
|
Re: Bitte Hilfe für SQL-Abfrage
[quote="DeddyH"]
SQL-Code:
Es funktioniert zwar, aber der Effekt bleibt gleich....
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 |
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 |
Re: Bitte Hilfe für SQL-Abfrage
NULL ist was anderes als 0
|
Re: Bitte Hilfe für SQL-Abfrage
Stimmt, hatte ich ganz übersehen :oops:
|
Re: Bitte Hilfe für SQL-Abfrage
Mit
SQL-Code:
werden garkene Punkte angezeigt
A.ID > Null
|
Re: Bitte Hilfe für SQL-Abfrage
Kennt Access NullIf()?
[Edit: Zitat:
|
Re: Bitte Hilfe für SQL-Abfrage
Zitat:
SQL-Code:
A.ID IS NOT NULL
|
Re: Bitte Hilfe für SQL-Abfrage
Ich habe die Funktion ISNULL() gefunden
|
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:
um herauszubekommen, welche Werte denn überhaupt vorhanden sind.
select count(*) as Anzahl, validiert from A group by validiert
Ist validiert erstmal nicht belegt und daher Null und wird erst beim Validieren auf true gesetzt? Dann könnte
SQL-Code:
helfen.
a.validiert <> true
Stephan |
Re: Bitte Hilfe für SQL-Abfrage
SQL-Code:
Dann doch besser
a.validiert <> true
SQL-Code:
not a.validiert
|
Re: Bitte Hilfe für SQL-Abfrage
Ich denke dass er deshalb die Tabelle spnamen nicht durchläuft
da die Bedingungen nicht stimmen. |
Re: Bitte Hilfe für SQL-Abfrage
Was kommt dabei raus?
SQL-Code:
2 oder 3 Zeilen? (die ominöse dritte von zwei Möglichkeiten?)
select count(*) as Anzahl, validiert from A group by validiert
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:
damit Du nur noch die zwei Werte hast.
update journal set validiert = false where validiert not is null
Stephan |
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. |
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 |
Re: Bitte Hilfe für SQL-Abfrage
Ich habs
:
SQL-Code:
so funktioniert es,
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 es werden nullen geschrieben wenn zwar spieler exisitiert aber keine punkte hat und umgekehrt DANK AN ALLE !!! |
Re: Bitte Hilfe für SQL-Abfrage
Wie erwähnt besser not statt =False
|
Re: Bitte Hilfe für SQL-Abfrage
Schön das du eine Lösung hast. Aber wieso so kompliziert?
SQL-Code:
Und bitte rede im Zusammenhang mit Datenbanken nicht von "durchläuft" da bekommt man ja Magenschmerzen.
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 |
Re: Bitte Hilfe für SQL-Abfrage
Zitat:
|
Re: Bitte Hilfe für SQL-Abfrage
Zitat:
SQL-Code:
a.validiert not Null
|
Re: Bitte Hilfe für SQL-Abfrage
Wohl eher
SQL-Code:
not A.Validiert
|
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