Mysql
 sql >> Base de données >  >> RDS >> Mysql

Trier après le cumul en préservant la position des lignes des totaux et des sous-totaux

Basé sur la version originale de La réponse de Johan :

SELECT *
FROM (
  SELECT 
    COALESCE(country, 'total') AS country,
    COALESCE(region, 'total' ) AS region,
    SUM(`value`) as `value`, 
  FROM `table` 
  GROUP BY country, region WITH ROLLUP
) t
ORDER BY country = 'total', country, region = 'total', `value`

La façon dont cette astuce fonctionne est que l'expression country = 'total' vaut 1 (vrai) si le country la colonne est égale à 'total' , et à 0 (faux) sinon. Dans l'ordre numérique croissant, 1 vient après 0. Ainsi, le tri par cette expression force toutes les lignes où le country la colonne est égale à 'total' pour trier après toutes les autres colonnes.

De même, trier par les expressions region = 'total' avant value force toutes les lignes avec la valeur 'total' dans leur region pour trier après toutes les autres lignes avec le même country , quelle que soit leur value colonne.

La même astuce fonctionne avec d'autres opérateurs de comparaison aussi. Par exemple, si vous vouliez forcer les valeurs négatives à trier après les valeurs positives, vous pouvez trier les lignes par `value` < 0, `value` .