Problém:
Chcete seřadit řádky podle součtů generovaných skupinou záznamů.
Příklad:
Naše databáze má tabulku s názvem training
s údaji ve čtyřech sloupcích:id , přihlaste se , rok a skóre .
id | přihlášení | rok | skóre |
---|---|---|---|
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 |
Pojďme získat přihlašovací jméno každého hráče spolu s celkovým součtem skóre za všechny roky a seřadit záznamy v sestupném pořadí podle celkového skóre hráčů.
Řešení:
K objednání záznamů na základě agregační funkce SUM()
použijeme operátor ORDER BY , která vypočítává celkové skóre pro každého hráče za všechny roky.
Zde je dotaz, který byste napsali:
SELECT login, SUM(score) AS total_score FROM training GROUP BY login ORDER BY SUM(score) DESC;
Zde je výsledek:
přihlášení | celkové_skóre |
---|---|
Andy | 70 |
Lucy | 62 |
Gary | 59 |
Diskuse:
Použijte ORDER BY, pokud chcete seřadit řádky podle hodnoty vrácené agregační funkcí, jako je SUM()
. Za operátorem ORDER BY následuje agregační funkce (v našem příkladu SUM()
). DESC se umístí za tuto funkci pro určení sestupného pořadí řazení. Nejprve se tedy zobrazí nejvyšší agregované hodnoty a poté se zobrazí postupně nižší hodnoty. Chcete-li seřadit vzestupně, můžete zadat ASC nebo jednoduše vynechat kterékoli klíčové slovo, protože vzestupně je výchozí řazení.
Ve výše uvedeném dotazu vybereme přihlášení každého hráče a součet jejich skóre za všechny roky. Toto celkové skóre se vypočítá pomocí SUM() se sloupcem skóre jako argumentem. K této souhrnné hodnotě přidáme alias (SUM(score) AS total_score
); tento alias můžete použít místo agregační funkce v klauzuli ORDER BY (ORDER BY total_score DESC
).
Všimněte si, že zahrnujeme přihlášení ve skupině GROUP BY. Pokud zahrneme sloupec do SELECT, musíme použít i sloupec v GROUP BY. V tomto příkladu používáme klauzuli GROUP BY následovanou přihlášením do sloupce, protože jsme tento sloupec vložili do SELECT. Všimněte si, že GROUP BY je v dotazu umístěno před ORDER BY.