2016-06-03 9 views
0

ich auf einer Abfrage ein paar Fragen auf Basis habe ich unter:Wählen falsche Ergebnisse für die Spiele und Teams Anzeigen

SELECT 
    RANK() OVER (PARTITION BY a.LeagueID ORDER BY a.LeagueID) AS WeekNumber, 
    a.TeamID AS HomeTeamID, 
    a.TeamAbbreviation AS HomeTeam, 
    b.TeamID AS AwayTeamID, 
    b.TeamAbbreviation AS AwayTeam, 
    a.LeagueID AS HomeLeague, 
    b.LeagueID AS AwayLeague 
FROM 
    dbo.Team a 
CROSS JOIN 
    dbo.Team b 
WHERE 
    a.TeamID != b.TeamID 
    AND b.TeamAbbreviation = 'CHE' OR a.TeamAbbreviation = 'CHE' 
    AND a.LeagueID = b.LeagueID 

Derzeit ist die Abfrage zeigt diese Ergebnisse:

enter image description here

Dies ist falsch und ich brauche Hilfe beim Refactoring der Ergebnisse. Was ich versuche zu erreichen ist:

  1. für jedes Spiel ein Team spielt (in diesem Beispiel ‚CHE‘), muss die Spalte Weeknumber die richtige Runde der Vorrichtungen enthalten aktualisieren. Es gibt mehrere Teams, also wenn alle Teams 1 Woche spielen, sollte WeekNumber '1' angezeigt werden, dann sollte die nächste Runde der Spiele WeekNumber '2' usw. anzeigen.

  2. Es zeigt 'CHE' gegen alle Teams an wenn sie wirklich nur gegen Teams in derselben Liga spielen sollten (daher a.LeagueID = b.LeagueID). Im Screenshot ist das Team gegen andere Teams aus anderen Ligen (andere Liga-IDs) zu sehen.

Was muss ich diese Funktion zu erhalten ändern?

SOLL OUTPUT:

WeekNumber HomeTeamID HomeTeam AwayTeamID AwayTeam HomeLeague Away League 
1   4   ARS  19  CHE  1   1 
2   14   BRC  19  CHE  1   1 
3   15   BRR  19  CHE  1   1 
+0

können Sie Ihre gewünschte Ausgabe zeigen? – Aldrin

+0

@Aldrin Enthaltene gewünschte Ausgabe wie Sie erwähnt –

Antwort

1

Am besten ist es JOIN zu verwenden, anstatt CROSS JOIN. Aber dein Problem sind Klammern um die Bedingungen.

Try this:

SELECT . . . 
FROM dbo.Team a JOIN 
    dbo.Team b 
    ON a.LeagueID = b.LeagueID AND a.TeamID <> b.TeamID 
WHERE b.TeamAbbreviation = 'CHE' OR a.TeamAbbreviation = 'CHE'; 

Sie können die letzte Bedingung ausdrücken als:

WHERE 'CHE' IN (a.TeamAbbreviation, b.TeamAbbreviation); 
+0

Cool, nur Problem ist der Rang jetzt wo wollen jede Runde von Übereinstimmungen, um die richtige Anzahl (siehe gewünschte Ausgabe) in Frage –

+0

@ CarlBrooks anzuzeigen. . . Vielleicht möchten Sie eine andere Frage stellen. Die Anweisung 'rank()' sieht peinlich aus. Es wird immer "1" zurückgegeben. –

Verwandte Themen