2017-05-16 3 views
3

Ich habe eine Abfrage für eine Tabelle, die ich nicht arbeiten kann.SQL - SUM, Distinct und TOP 4

Im Folgenden finden Sie Tabellenbeispiele;

Tabelle Mitglieder:

|ID|NAME| 
|1 |John| 
|2 |Joe | 
|3 |Paul| 

Tabelle Noten:

|ID |Score |      
|1 | 25 |      
|1 | 34 |      
|2 | 54 |      
|1 | 23 |      
|3 | 43 |      
|2 | 14 |      
|1 | 23 |      
|3 | 43 |      
|3 | 14 |            
|3 | 43 |      
|2 | 14 |      
|1 | 23 |      
|3 | 43 |      
|3 | 14 | 

Ich möchte die Mitglieder angezeigt werden benennen und dann Summe dort am besten 2 Partituren, und zeigen Sie es mit größter SUM‘ d punkte zuerst.

|Paul| 86 | 
|Joe | 68 | 
|John| 57 | 

Vielen Dank im Voraus

+2

Welche Datenbank benutzen Sie? – ollie

+0

Was hat 'TOP 4' damit zu tun? –

+4

Zeigen Sie uns die Abfrage, die Sie bisher haben. –

Antwort

0

können Sie eine group by Klausel und eine subselect verwenden

SELECT M.NAME 
      ,(SELECT SUM(S2.SCORE) 
      FROM (SELECT TOP 2 S1.Score FROM SCORES S1 
        WHERE S1.ID = S.ID 
        ORDER BY S1.Score DESC) AS S2 
      ) AS Two_Highest_Scores 
FROM  SCORES S 
LEFT JOIN MEMBERS M 
     ON M.ID = S.ID 
GROUP BY M.ID 
      ,M.NAME 

Können Sie das testen?

+0

Danke, versuchte dies und es zeigt die Summe der beiden niedrigsten Werte, nicht zu sicher, warum? – Senna

+0

Oh, es muss im DESC-Modus bestellt werden, ich werde es ändern – luisarcher

+0

Dank Luis, du bist eine große Hilfe und behoben meine dumme Frage in kürzester Zeit. – Senna

5

können Sie verwenden row_number Funktionsfenster für pro-ID TOP 2 Partituren zu erreichen, dann summieren es group by mit und schließlich an die Mitglieder Tisch kommen, so etwas wie:

select MEMBERS.name, tt.s from MEMBERS 
inner join (
    select ID, sum(Score) s from (
     select ID, Score, row_number() over(partition by ID order by Score desc) rn from SCORES 
    ) t 
    where rn <= 2 
    group by id 
)tt 
on MEMBERS.id = tt.id 
ORDER BY tt.s 
+0

Dies funktionierte ein Vergnügen, vielen Dank – Senna

+0

Wo würde ich einen ORDER BY-Score hinzufügen? – Senna

+0

@Senna - Happy zu helfen, können Sie ORDER BY am Ende hinzufügen, bearbeitete ich Antwort, bitte sehen Sie –

0

Diese Abfrage (SQL Server 2012+ benötigt)

SELECT name, best_score 
FROM 
(
    SELECT id, score 
     , SUM(score) OVER (PARTITION BY id ORDER BY score DESC ROWS BETWEEN CURRENT ROW AND 1 FOLLOWING) AS best_score 
     , ROW_NUMBER() OVER (PARTITION BY id ORDER BY score DESC) AS row_num 
    FROM Scores 
) AS t 
INNER JOIN Members AS m ON (m.id = t.id AND t.row_num = 1) 
ORDER BY best_score DESC; 

Zuerst werden die Bewertungen für jede ID nach absteigend sortiert.

(PARTITION BY id ORDER BY score DESC) 

Dann SUM() auf der Partitur der aktuellen Zeile und die folgenden 1 Zeile von dem ROWS verwendet wird Klausel

ROWS BETWEEN CURRENT ROW AND 1 FOLLOWING 

So ist die innere Abfrage gibt die kombinierte Summe von 2 Punkte für jede Zeile. Dann wird die erste Zeilennummer verwendet, um die best_score-Zeile zu erhalten. GROUP BY könnte auch stattdessen verwendet werden.