Basado en la versión original de Respuesta 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 forma en que funciona este truco es que la expresión country = 'total'
se evalúa como 1 (verdadero) si el country
columna es igual a 'total'
, y a 0 (falso) en caso contrario. En orden numérico ascendente, 1 viene después de 0. Por lo tanto, ordenar por esa expresión fuerza cualquier fila donde el country
columna es igual a 'total'
para ordenar después de cualquier otra columna.
De manera similar, ordenar por las expresiones region = 'total'
antes de value
fuerza cualquier fila con el valor 'total'
en su region
para ordenar después de cualquier otra fila con el mismo country
, independientemente de su value
columna.
El mismo truco funciona con otros operadores de comparación
también. Por ejemplo, si desea forzar que los valores negativos se clasifiquen después de los valores positivos, puede ordenar las filas por `value` < 0, `value`
.