Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi SQL "umbauen" (https://www.delphipraxis.net/109525-sql-umbauen.html)

Salomon 3. Mär 2008 07:22

Datenbank: MS SQL • Zugriff über: ADO

SQL "umbauen"
 
Hallo,
mit dem unten aufgeführten SQL bekomme ich die Anzahl der Issues die ein Team an dem Tag X eröffnet hat. Das funktioniert soweit super. Allerdings müsste ich das SQL so haben, das auch die Teams in der Ergebnismenge sind, die keine Issues eröffnet haben. Diese sollen halt mit 0 dastehen. Wie bekomme ich das hin ??

Das ganze brauche ich, da ich das Ergebnis in einem Balkendiagram in FastReport anzeigen möchte, und dort alle Teams sichtbar sein sollen.

SQL-Code:
select t.teamID, count(i.issueID) as TotalIssues
from tb_teams t left join tb_users u on u.fk_teamid = t.teamid
left join tb_issues i on i.fk_userid = u.userid

where
i.fk_projectid = 1 
and i.isdeleted = 0
and CONVERT(varchar(8), '26.02.2008 00:00:00', 104) = CONVERT(varchar(8), CreationDate, 104)

group by t.teamid
order by t.teamid

Thanx
Marcus

NormanNG 3. Mär 2008 07:33

Re: SQL "umbauen"
 
Hi,

also zuerst fällt mir das Konstrukt
SQL-Code:
and CONVERT(varchar(8), '26.02.2008 00:00:00', 104) = CONVERT(varchar(8), CreationDate, 104)
auf. Warum vergleichst du nicht direkt die Datum-Spalten bzw. verwendest DateDiff?

Zur Frage selbst:
Wenn du mit left joins die Issues dazuholst, dann sind für alle Team, die keine Issues haben, die entsprechenden Issue-Spalte gleich NULL. Dann sind aber alle WHERE-Bedingungen, die auf Issue-Spaltenwerte prüfen falsch...

Also muss du die Spaltenwerte auch auf Null prüfen, etwa so:
SQL-Code:
where
(i.fk_projectid = 1 and i.isdeleted = 0)
or
(i.fk_projektid is null)

mkinzler 3. Mär 2008 07:38

Re: SQL "umbauen"
 
Versuchs mal mit einem right join

Salomon 3. Mär 2008 07:58

Re: SQL "umbauen"
 
Der right join führt zu dem selben Ergebnis.

@NormanNG: Mit dem wilden Konstrukt habe ich testweise alle Issues eines Tages gefiltert.

Das Prüfen auf NUll bekomme ich leider auch nicht hin. Selbst wenn ich alle Where Bedingungen bis auf die Datumseinschränkung auskommentiere bekomme ich ja nur den IssueCount für Teams die mindestens eine Issue erstellt haben.

NormanNG 3. Mär 2008 08:58

Re: SQL "umbauen"
 
Hi,

also mit der WHERE-Clause
SQL-Code:
where
( (i.fk_projectid = 1 and i.isdeleted = 0)
  or (i.fk_projektid is null) )
and
( (CONVERT(varchar(8), '26.02.2008 00:00:00', 104) = CONVERT(varchar(8), CreationDate, 104))
  or (CreationDate is null)
)
funktioniert das bei mir (mit ein paar Testdaten).

Wie sieht denn dein SQL jetzt aus?

[edit]P.S.: Aus welcher Tabelle kommt denn CreationDate? Wenn das aus tb_issues kommt gilt das Gleiche wie oben!

Salomon 3. Mär 2008 09:13

Re: SQL "umbauen"
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hey,
mmh, so gehts bei mir leider auch nicht. Die übrigen Where Bedingungen können wir eigentlich weglassen. Allerdings schränkt das Datum die Ergebnismenge so ein, das die anderen Teams fehlen. Mein SQL sieht momentan so aus:

SQL-Code:
select t.name, count(i.issueID) as TotalIssue
from tb_teams t full join tb_users u on u.fk_teamid = t.teamid
full join tb_issues i on i.fk_userid = u.userid
where  
 CONVERT(varchar(8), '26.02.2008 00:00:00', 104) = CONVERT(varchar(8), CreationDate, 104)
group by t.name
order by t.name
Ich habe mal die Tabellen als Diagramm angehängt. Dann seht ihr genau wie sie aussehen. An das Team einer Issue kommt man nur über den User der in FK_UserID steht.

NormanNG 3. Mär 2008 09:15

Re: SQL "umbauen"
 
Hi,

Sorry, mein Edit oben kam zu spät.

Das CreationDate kommt ja auch aus tb_issues. Dann muss das auch auf Null geprüft oder anders geklammert werden...
siehe oben.

NormanNG 3. Mär 2008 09:37

Re: SQL "umbauen"
 
Hi,

hier mal eine Abfrage, die laufen sollte:
SQL-Code:
select t.name, count(i.issueID) as TotalIssue
from tb_teams t
left join tb_users u on u.fk_teamid = t.teamid
left join tb_issues i on i.fk_userid = u.userid
where  
( CONVERT(varchar(8), '26.02.2008 00:00:00', 104) = CONVERT(varchar(8), CreationDate, 104) )
or
( CreationDate is null )
group by t.name
order by t.name
... left join!

Salomon 3. Mär 2008 09:39

Re: SQL "umbauen"
 
Hey super, danke für deine Hilfe :)

Das funktioniert! Jetzt muss ich das nur noch richtig verstehen...

Ich muss also die Werte die aus der TB_Issues kommen auch noch auf NULL prüfen?

Mit left join gehts scheinbar auch.

NormanNG 3. Mär 2008 09:53

Re: SQL "umbauen"
 
Hi,

Zitat:

Jetzt muss ich das nur noch richtig verstehen...
Ist eigendlich ganz einfach:

Du holst dir Daten aus einer Tabelle (from ..., hier tb_team).
Dann legst du immer dann Daten aus anderen Tabellen dazu, wenn sie "passen" (...join...on...). Wenn Sie nicht passen, dann sind alle Spalten dieser Tabelle NULL (left join).
In der Where-Bedingung kann man nun Spalten dieser gejointen-Tabellen prüfen. Wenn aber auf einen exakten Wert geprüft wird (i.fk_projectid = 1), dann sind damit alle Zeilen der Ergebnismenge ausgeschlossen, die hier NULL haben (NULL<>1).

Du wolltest aber auch genau diese Zeilen zeigen/zählen, bei denen keine Daten aus den gejointen Tabellen vorhanden sind (i.e. ein Team ohne Issues). Also muss du hier immer den Fall NULL berücksichtigen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:10 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