AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

SQL "umbauen"

Ein Thema von Salomon · begonnen am 3. Mär 2008 · letzter Beitrag vom 30. Apr 2008
Antwort Antwort
Seite 1 von 3  1 23      
Benutzerbild von Salomon
Salomon

Registriert seit: 9. Jun 2002
453 Beiträge
 
#1

SQL "umbauen"

  Alt 3. Mär 2008, 08:22
Datenbank: MS SQL • Zugriff über: ADO
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
01001000 01100001 01101100 01101100 01101111
01010111 01100101 01101100 01110100 00100001

http://www.it-adviser.net
  Mit Zitat antworten Zitat
NormanNG

Registriert seit: 1. Feb 2006
294 Beiträge
 
Delphi 2007 Professional
 
#2

Re: SQL "umbauen"

  Alt 3. Mär 2008, 08:33
Hi,

also zuerst fällt mir das Konstrukt
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)
Gruß
Norman
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

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

Re: SQL "umbauen"

  Alt 3. Mär 2008, 08:38
Versuchs mal mit einem right join
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von Salomon
Salomon

Registriert seit: 9. Jun 2002
453 Beiträge
 
#4

Re: SQL "umbauen"

  Alt 3. Mär 2008, 08:58
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.
01001000 01100001 01101100 01101100 01101111
01010111 01100101 01101100 01110100 00100001

http://www.it-adviser.net
  Mit Zitat antworten Zitat
NormanNG

Registriert seit: 1. Feb 2006
294 Beiträge
 
Delphi 2007 Professional
 
#5

Re: SQL "umbauen"

  Alt 3. Mär 2008, 09:58
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!
Gruß
Norman
  Mit Zitat antworten Zitat
Benutzerbild von Salomon
Salomon

Registriert seit: 9. Jun 2002
453 Beiträge
 
#6

Re: SQL "umbauen"

  Alt 3. Mär 2008, 10:13
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.
Miniaturansicht angehängter Grafiken
issue_pro_team_707.jpg  
01001000 01100001 01101100 01101100 01101111
01010111 01100101 01101100 01110100 00100001

http://www.it-adviser.net
  Mit Zitat antworten Zitat
NormanNG

Registriert seit: 1. Feb 2006
294 Beiträge
 
Delphi 2007 Professional
 
#7

Re: SQL "umbauen"

  Alt 3. Mär 2008, 10:15
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.
Gruß
Norman
  Mit Zitat antworten Zitat
NormanNG

Registriert seit: 1. Feb 2006
294 Beiträge
 
Delphi 2007 Professional
 
#8

Re: SQL "umbauen"

  Alt 3. Mär 2008, 10:37
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!
Gruß
Norman
  Mit Zitat antworten Zitat
Benutzerbild von Salomon
Salomon

Registriert seit: 9. Jun 2002
453 Beiträge
 
#9

Re: SQL "umbauen"

  Alt 3. Mär 2008, 10:39
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.
01001000 01100001 01101100 01101100 01101111
01010111 01100101 01101100 01110100 00100001

http://www.it-adviser.net
  Mit Zitat antworten Zitat
NormanNG

Registriert seit: 1. Feb 2006
294 Beiträge
 
Delphi 2007 Professional
 
#10

Re: SQL "umbauen"

  Alt 3. Mär 2008, 10:53
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.
Gruß
Norman
  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 07:42 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