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 2 von 3     12 3      
Benutzerbild von Salomon
Salomon

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

Re: SQL "umbauen"

  Alt 3. Mär 2008, 11:30
Hey,
das ich über die Joins eine große Datenmenge "baue" war mir klar. Das die Spalten auf NULL stehen wenn sie nicht passen war mir nicht so bewust. Ohne die NULL Prüfung konnte ich dann gar nicht an die Daten kommen.
01001000 01100001 01101100 01101100 01101111
01010111 01100101 01101100 01110100 00100001

http://www.it-adviser.net
  Mit Zitat antworten Zitat
Benutzerbild von Salomon
Salomon

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

Re: SQL "umbauen"

  Alt 29. Apr 2008, 09:54
Hi all,
ich muss den Thread noch einmal reaktivieren. Mir ist aufgefallen, das in der Ergebnismenge nicht alle Teams aus der TeamTabelle auftauchen. Drei fehlen. Allerdings sehe ich nicht woran das liegen kann

Nehme ich die zeitliche Einschränkung raus, sind alle Teams dabei. Etwas weiter oben habe ich den DB Aufbau angehängt.


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
((i.CreationDate >= '03.03.2008 00:00:00')
 and (i.CreationDate < '09.03.2008 00:00:00')) or (i.CreationDate is null)

group by t.name
order by t.name
Thanx Marcus
01001000 01100001 01101100 01101100 01101111
01010111 01100101 01101100 01110100 00100001

http://www.it-adviser.net
  Mit Zitat antworten Zitat
Benutzerbild von Olli73
Olli73

Registriert seit: 25. Apr 2008
Ort: Neunkirchen
755 Beiträge
 
#13

Re: SQL "umbauen"

  Alt 29. Apr 2008, 18:57
Hallo,

ich nehme mal an, dass die Teams, die gar keine Issues und die Teams, die Issues im genannten Zeitraum haben auftauchen, aber nicht die, die Issues in einem anderen Zeitraum haben. Wäre zumindest logisch, wenn man sich vorstellt, dass zuerst der JOIN ausgeführt wird und anschließend deine Bedingungen darüber laufen

Versuch doch mal die Bedingung mit in den Join reinzunehmen:

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 and
  (i.CreationDate >= '03.03.2008 00:00:00') and (i.CreationDate < '09.03.2008 00:00:00')
group by t.name
order by t.name
  Mit Zitat antworten Zitat
NormanNG

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

Re: SQL "umbauen"

  Alt 29. Apr 2008, 19:02
Hi,

es macht keinen Unterschied, ob die Bedingungen direkt im Join oder im Where gesetzt sind.
Welche Daten fehlen denn?

[edit]
ich seh´gerade, du machst full joins und prüft dann auf [(i.CreationDate is null)].
Kann es sein, dass die Teams fehlen, die garkeine issues haben?
Versuchs doch mal mit LEFT JOIN...
Gruß
Norman
  Mit Zitat antworten Zitat
Benutzerbild von Olli73
Olli73

Registriert seit: 25. Apr 2008
Ort: Neunkirchen
755 Beiträge
 
#15

Re: SQL "umbauen"

  Alt 29. Apr 2008, 19:35
Zitat:
es macht keinen Unterschied, ob die Bedingungen direkt im Join oder im Where gesetzt sind.
Bist du sicher bzw. hast du es getestet. Bei mir macht es nämlich (mit anderen Daten) einen Unterschied.
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#16

Re: SQL "umbauen"

  Alt 29. Apr 2008, 20:40
Du willst also (1) Teams auflisten, und wenn die 'issues' haben, dann diese Zählen. Oder willst Du (2) nur die Teams aufzählen, die innerhalb des Zeitraumes 'issues' hatten und dann diese Teams und deren Anzahl auflisten?

Zu 1. fällt mir spontan sowas ein:

SQL-Code:
select t.name,
       coalesce (
         (select count (distinct i.issueID)
            from tb_issues i
                 join tb_users u on i.fk_userID = u.userID
           where u.fk_teamID = t.teamID
             and i.CreationDate Between '20080303and '20080309 23:59:59')
         ,0) as Anzahl
from tb_teams t
order by t.name
Hier werden garantiert alle Teams aufgelistet sowie deren Issueanzahl im gewünschten Zeitraum.
Und zu 2.
SQL-Code:
select t.name,
       count(i.issueID) as TotalIssue
from tb_teams t
     join tb_users u on u.fk_teamid = t.teamid
     join tb_issues i on i.fk_userid = u.userid
where i.CreationDate Between '20080303and '20080309 23:59:59'
group by t.name
order by t.name
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
NormanNG

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

Re: SQL "umbauen"

  Alt 30. Apr 2008, 08:32
Hi,


Zitat von Olli73:
Zitat:
es macht keinen Unterschied, ob die Bedingungen direkt im Join oder im Where gesetzt sind.
Bist du sicher bzw. hast du es getestet. Bei mir macht es nämlich (mit anderen Daten) einen Unterschied.
@Olli73
Das dachte ich bisher immer
Hast du mal ein Beispeil für mich?
Gruß
Norman
  Mit Zitat antworten Zitat
Benutzerbild von Olli73
Olli73

Registriert seit: 25. Apr 2008
Ort: Neunkirchen
755 Beiträge
 
#18

Re: SQL "umbauen"

  Alt 30. Apr 2008, 09:23
Zitat:
Hast du mal ein Beispeil für mich?
@NormanNG:

Ich veruche mal ein einfaches Beispiel mit 2 Tabellen und wenigen Daten zu konstruieren:

SQL-Code:
Tabelle1 mit TeamA, TeamB, TeamC und Tabelle 2 mit Issues, wobei TeamA und TeamB jeweils 1 und TeamC keinen Issue hat:

select a.*, b.* from tabelle1 a left join tabelle2 b on b.team = a.team
ergibt dann:

TeamA 28.04.2008 ...
TeamB 30.04.2008 ...
TeamC <NULL> ...

wenn ich dann anfüge "where b.datum = '28.04.2008' or b.datum is null" wird obiges Ergebnis(!) eingeschränkt und TeamB fällt dadurch weg, weil es die Bedingung nicht erfüllt:

TeamA 28.04.2008 ...
TeamC <NULL> ...

schreibe ich aber anstatt(!) "where ..." dann "AND b.datum = '28.04.2008' wird die Bedingung bereits beim Aufbau des Joins(!) ausgewertet und man erhält:

TeamA <NULL> ...
TeamB 30.04.2008 ...
TeamC <NULL> ...
Ich hoffe mal, dass ich mich verständlich ausgedrückt habe.
  Mit Zitat antworten Zitat
NormanNG

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

Re: SQL "umbauen"

  Alt 30. Apr 2008, 11:11
Hi,

du schummelst


im Original stand ein full-join, und darauf bezog sich meine Anmerkung.
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 and
  (i.CreationDate >= '03.03.2008 00:00:00') and (i.CreationDate < '09.03.2008 00:00:00')
group by t.name
order by t.name
Bei einem left-join hat du natürlich Recht.
Gruß
Norman
  Mit Zitat antworten Zitat
Benutzerbild von Salomon
Salomon

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

Re: SQL "umbauen"

  Alt 30. Apr 2008, 11:51
@alzaimar: Dein Fall 1 ist genau das was ich suche Damit mir sowas auch mal spontan einfällt habe ich mir erstmal ein SQL Buch bestellt Auf die Abfrage wäre ich wohl so nie gekommen.
Ich brauche immer alle Teams, da ich in einem Report alle geschlossen den geöffneten Issues pro Team gegenüberstellen will.


Wenn ich eine weitere Tabelle joine, muss ich dann Felder darin dann auch auf NULL abfragen? Ich glaube nicht, oder? Sorry, wenn das eine "komische" Frage ist. Für mich ist das aber schon ein recht komplexes SQL Querry.

SQL-Code:
set transaction isolation level read uncommitted;
select t.name as TeamName,
       coalesce (
         (select count (distinct i.issueID)
            from tb_issues i
                 join tb_users u on i.fk_userID = u.userID
                 join tb_history h on h.fk_issueid = i.issueid
           where u.fk_teamID = t.teamID
                and ((i.visibility = 1) or i.visibility is null) <== Auf NULL prüfen?
                and ((h.action = 1) or h.action is null)
                and ((i.FK_IssueStatusID = 5) or i.FK_IssueStatusID is null)
  
                and ((h.ChangeDate >= '03.03.2008 00:00:00/* -1 */ and h.ChangeDate < '09.03.2008 00:00:00')
                 or (h.ChangeDate is null))
             ),0) as Anzahl
from tb_teams t
order by t.name
Das ich während des Joins schon die Datenmenge einschränken kann wusste ich auch noch nicht, hier lernt man doch immer viel dazu Die verschiedenen Join Varianten hatte ich in meinem ursprünlichen Query fast alle durchprobiert. Der Full oder left join brachten da das selbe Ergebnis.
01001000 01100001 01101100 01101100 01101111
01010111 01100101 01101100 01110100 00100001

http://www.it-adviser.net
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


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 08:29 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