Mysql
 sql >> Database >  >> RDS >> Mysql

Ordina dopo il rollup conservando la posizione delle righe di totali e subtotali

Basato sulla versione originale di Risposta di Giovanni :

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`

Il modo in cui funziona questo trucco è che l'espressione country = 'total' restituisce 1 (true) se il country la colonna è uguale a 'total' , e in caso contrario a 0 (falso). In ordine numerico crescente, 1 viene dopo 0. Pertanto, l'ordinamento in base a tale espressione forza tutte le righe in cui il country la colonna è uguale a 'total' per ordinare dopo qualsiasi altra colonna.

Allo stesso modo, ordinando in base alle espressioni region = 'total' prima del value forza tutte le righe con il valore 'total' nella loro region per ordinare dopo qualsiasi altra riga con lo stesso country , indipendentemente dal loro value colonna.

Lo stesso trucco funziona con altri operatori di confronto anche. Ad esempio, se desideri forzare l'ordinamento dei valori negativi dopo i valori positivi, puoi ordinare le righe per `value` < 0, `value` .