sql >> Databasteknik >  >> RDS >> Mysql

Sortera efter sammanslagning och bevara total- och delsummorradernas position

Baserat på originalversionen av Johans svar :

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`

Sättet det här tricket fungerar på är att uttrycket country = 'total' evalueras till 1 (true) om country kolumn är lika med 'total' , och till 0 (falskt) annars. I stigande numerisk ordning kommer 1 efter 0. Sortering efter det uttrycket tvingar alltså fram alla rader där country kolumn är lika med 'total' för att sortera efter andra kolumner.

På samma sätt, sortering efter uttrycken region = 'total' före value tvingar fram alla rader med värdet 'total' i deras region för att sortera efter andra rader med samma country , oavsett deras value kolumn.

Samma knep fungerar med andra jämförelseoperatorer för. Om du till exempel vill tvinga negativa värden att sortera efter positiva värden kan du sortera raderna efter `value` < 0, `value` .



  1. Hur SQLite Min() fungerar

  2. Hur fungerar MySQL-index?

  3. MySQL5.6 har fastnat i processen för att försöka starta tjänsten

  4. Problem med frågedata i en tabell