sql >> Databasteknik >  >> RDS >> Database

Hur man beställer rader efter gruppsumma i SQL

Problem:

Du vill sortera rader efter summor som genereras av en grupp poster.

Exempel:

Vår databas har en tabell som heter training med data i fyra kolumner:id , logga in , år , och poäng .

id logga in år poäng
1 Andy 2018 24
2 Lucy 2019 25
3 Andy 2019 20
4 Lucy 2018 16
5 Gary 2019 18
6 Gary 2018 19
7 Gary 2017 22
8 Lucy 2017 21
9 Andy 2017 26

Låt oss få inloggningsnamnet för varje spelare tillsammans med den totala summan av poäng för alla år, och sätter rekord i fallande ordning enligt spelarnas totala poäng.

Lösning:

Vi använder operatorn ORDER BY för att beställa poster baserat på aggregatfunktionen SUM() , som beräknar den totala poängen för varje spelare under alla år.

Här är frågan du skulle skriva:

SELECT login,
  SUM(score) AS total_score
FROM training
GROUP BY login
ORDER BY SUM(score) DESC;

Här är resultatet:

logga in total_score
Andy 70
Lucy 62
Gary 59

Diskussion:

Använd ORDER BY om du vill ordna rader enligt ett värde som returneras av en aggregerad funktion som SUM() . Operatorn ORDER BY följs av aggregatfunktionen (i vårt exempel, SUM() ). DESC placeras efter denna funktion för att ange en fallande sorteringsordning. Således visas de högsta sammanlagda värdena först och sedan gradvis lägre värden. För att sortera i stigande ordning kan du ange ASC eller helt enkelt utelämna något av sökorden, eftersom stigande är standardsorteringsordningen.

I frågan ovan väljer vi varje spelares inloggning och summan av deras poäng för alla år. Denna totala poäng beräknas med SUM() med poängkolumnen som ett argument. Vi lägger till ett alias för detta aggregerade värde (SUM(score) AS total_score ); du kan använda detta alias istället för aggregatfunktionen i ORDER BY-satsen (ORDER BY total_score DESC ).

Observera att vi inkluderar inloggning i GROUP BY. Om vi ​​inkluderar en kolumn i SELECT måste vi även använda kolumnen i GROUP BY. I det här exemplet använder vi GROUP BY-satsen följt av kolumninloggningen eftersom vi lägger denna kolumn i SELECT. Observera att GROUP BY placeras före ORDER BY i frågan.


  1. sql-server ogiltigt objektnamn - men tabeller listas i SSMS-tabelllistan

  2. SQL-fråga för att ta bort databas i MySQL

  3. Behöver Oracle SQL för att dela upp datum/tidsintervall efter dag

  4. CASE-sats inom WHERE-satsen i SQL Server 2008