sql >> Database teknologi >  >> RDS >> Database

Sådan bestiller du rækker efter gruppesum i SQL

Problem:

Du vil gerne sortere rækker efter de summer, der genereres af en gruppe poster.

Eksempel:

Vores database har en tabel med navnet training med data i fire kolonner:id , login , år , og score .

id login år score
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

Lad os få login-navnet på hver spiller sammen med den samlede sum af score for alle år, og sætter rekorder i faldende rækkefølge i henhold til spillernes samlede score.

Løsning:

Vi bruger operatoren ORDER BY til at bestille poster baseret på aggregatfunktionen SUM() , som beregner den samlede score for hver spiller på tværs af alle år.

Her er den forespørgsel, du ville skrive:

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

Her er resultatet:

login total_score
Andy 70
Lucy 62
Gary 59

Diskussion:

Brug ORDER BY, hvis du vil bestille rækker i henhold til en værdi, der returneres af en aggregeret funktion såsom SUM() . Operatoren ORDER BY efterfølges af aggregatfunktionen (i vores eksempel SUM() ). DESC placeres efter denne funktion for at angive en faldende sorteringsrækkefølge. Således vises de højeste samlede værdier først, derefter vises gradvist lavere værdier. For at sortere i stigende rækkefølge kan du angive ASC eller blot udelade et af søgeordene, da stigende er standardsorteringsrækkefølgen.

I forespørgslen ovenfor vælger vi hver spillers login og summen af ​​deres score for alle år. Denne samlede score beregnes ved hjælp af SUM() med scorekolonnen som argument. Vi tilføjer et alias for denne samlede værdi (SUM(score) AS total_score ); du kan bruge dette alias i stedet for aggregatfunktionen i ORDER BY-sætningen (ORDER BY total_score DESC ).

Bemærk, at vi inkluderer login i GROUP BY. Hvis vi inkluderer en kolonne i SELECT, skal vi også bruge kolonnen i GROUP BY. I dette eksempel bruger vi GROUP BY-sætning efterfulgt af kolonnelogin, fordi vi sætter denne kolonne i SELECT. Bemærk, at GROUP BY er placeret før ORDER BY i forespørgslen.


  1. Få en liste over datoer mellem to datoer ved hjælp af en funktion

  2. Hvordan analyserer man strenge som en professionel ved hjælp af SQL SUBSTRING()-funktionen?

  3. Sådan konfigureres SELinux til PostgreSQL og TimescaleDB

  4. Hvad er forskellen mellem præcision og skala?