2016-06-14 11 views
2

Ich habe eine Abfrage unter das in der Lage ist, die Gesamtgewichtung der einzelnen Teams auf den 11 Spielern berechnen sie wählen:Wie zwei Ergebnisse innerhalb einer Abfrage angezeigt werden?

SELECT TeamID, SUM(PlayerWeighting) as TeamWeight 
    FROM (
     SELECT * FROM(
      SELECT pl.*, 
        ROW_NUMBER() OVER(PARTITION BY pl.TeamID, pl.Position ORDER BY NEWID()) AS Rnk 
      FROM(
       SELECT DISTINCT p.PlayerID, p.Position, p.PlayerWeighting, p.FirstName, p.Surname, t.TeamID, t.TeamAbbreviation, f.WeekNumber 
       FROM dbo.Fixture f 
       INNER JOIN dbo.League l ON f.LeagueID = l.LeagueID 
       INNER JOIN dbo.Team t ON l.LeagueID = t.LeagueID 
       INNER JOIN dbo.Player p ON t.TeamID = p.TeamID 
       WHERE f.WeekNumber = 1) 
       pl) po 
     WHERE (po.position = 'GK' and po.rnk = 1) OR 
       (po.position = 'DF' and po.rnk <= 4) OR 
       (po.position = 'MF' and po.rnk <= 4) OR 
       (po.position = 'FW' and po.rnk <= 2)) as T 
    GROUP BY T.TeamID 

Die zweite SELECT-Anweisung innerhalb der obigen Abfrage gibt tatsächlich die Liste der Spieler pro Team (Dies wurde getestet, bevor ich die erste SELECT-Anweisung zur Berechnung der Gesamtsumme verwendete).

Was ich tun möchte, ist irgendwie zwei Ergebnisse anzuzeigen. Ein Ergebnis zeigt die Gewichtung des Teams und ein weiteres Ergebnis zeigt die beteiligten Spieler in jeder Teamwertung. Wie bekomme ich die obige Abfrage, um beide Ergebnisse in einer Ausführung anzuzeigen?

Danke

UPDATE:

Unten ist das, was die Abfrage aussieht, wenn ich den ganzen Code ausführen:

enter image description here

Unterhalb der Spieler Gewichtungs Ergebnisse ist, wenn ich den Kommentar aus erste SELECT-Anweisung in der Abfrage:

enter image description here

Ich möchte nur beide Tabellen getrennt angezeigt werden, wenn sie ausgeführt werden. Offensichtlich kann ich nicht einfach die Abfrage kopieren und unten einfügen und entfernen Sie die erste Select-Anweisung, da die Spieler in der zweiten Abfrage kann die Team-Gewichtung in der ersten Abfrage erzeugt werden, wenn das Sinn macht

+0

Können Sie einige Beispielergebnisse liefern? – qxg

+0

@qxg Ich habe ein Update in der Frage zur Verfügung gestellt, um die Ergebnisse anzuzeigen –

+0

Wie können sie anders sein? Weil sich Daten häufig ändern? Wenn ja, können Sie die Ergebnisse der inneren Abfrage in einer temporären/Speichertabelle speichern und dann diese (temporäre Tabelle) für die weitere Anzeige von 2 Ergebnismengen verwenden. – sallushan

Antwort

2

Sie sollten nur verwenden SUM() OVER() ohne die äußere Abfrage:

SELECT po.*, 
      SUM(po.playerWeighting) OVER(PARTITION BY po.teamID) as teamWeight 
    FROM(
     SELECT pl.*, 
       ROW_NUMBER() OVER(PARTITION BY pl.TeamID, pl.Position ORDER BY NEWID()) AS Rnk 
     FROM(
      SELECT DISTINCT p.PlayerID, p.Position, p.PlayerWeighting, p.FirstName, p.Surname, t.TeamID, t.TeamAbbreviation, f.WeekNumber 
      FROM dbo.Fixture f 
      INNER JOIN dbo.League l ON f.LeagueID = l.LeagueID 
      INNER JOIN dbo.Team t ON l.LeagueID = t.LeagueID 
      INNER JOIN dbo.Player p ON t.TeamID = p.TeamID 
      WHERE f.WeekNumber = 1) 
      pl) po 
    WHERE (po.position = 'GK' and po.rnk = 1) OR 
      (po.position = 'DF' and po.rnk <= 4) OR 
      (po.position = 'MF' and po.rnk <= 4) OR 
      (po.position = 'FW' and po.rnk <= 2) 

SUM() OVER() ist eine analytische Funktion vor allem für kumulative Summe verwendet. Wenn keine ORDER BY nach der PARTITION BY erwähnt wird, wird dies einfach die Gesamtsumme für jede im PARTITION BY Teil genannte Gruppe zurückgeben.

0

Während @ sagis Antwort gut ist, haben Sie 1 Ergebnis mit all den Dingen, die Sie brauchen. Aber auch wenn Sie auf 2 Ergebnisse bestehen, können Sie eine Tabellenvariable verwenden, zum Beispiel

DECLARE @testTable table(column1 int, column2 varchar(100)); 

INSERT INTO @testTable(column1, column2) 
    SELECT 1, 'abc';   -- <- you can put your query here 


-- first result set 
SELECT * 
FROM @testTable;   

-- second result set 
SELECT COUNT(1) AS TotalRows 
FROM @testTable; 
Verwandte Themen