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.