Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Ordenar após o rollup preservando a posição das linhas de totais e subtotais


Com base na versão original de Resposta 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`

A maneira como esse truque funciona é que a expressão country = 'total' avalia como 1 (verdadeiro) se o country coluna é igual a 'total' , e para 0 (falso) caso contrário. Em ordem numérica crescente, 1 vem depois de 0. Assim, classificar por essa expressão força todas as linhas em que o country coluna é igual a 'total' para classificar após quaisquer outras colunas.

Da mesma forma, ordenando pelas expressões region = 'total' antes de value força qualquer linha com o valor 'total' em sua region para classificar após quaisquer outras linhas com o mesmo country , independentemente de seu value coluna.

O mesmo truque funciona com outros operadores de comparação também. Por exemplo, se você quisesse forçar valores negativos a serem classificados após valores positivos, você poderia classificar as linhas por `value` < 0, `value` .