sql >> Base de Datos >  >> RDS >> Mysql

Ordenar después de acumular conservando la posición de las filas de totales y subtotales

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` .