SELECT CASE WHEN X >= Y && X >= Z THEN X
WHEN Y >= Z && Y >= X THEN Y
ELSE Z END,
CASE WHEN X >= Y && X < Z THEN X
WHEN X >= Z && X < Y THEN X
WHEN Y >= X && Y < Z THEN Y
WHEN Y >= Z && Y < Z THEN Y
ELSE Z END,
CASE WHEN X <= Y && X <= Z THEN X
WHEN Y <= Z && Y <= X THEN Y
ELSE Z
FROM Table
ORDER BY CASE WHEN X >= Y && X >= Z THEN X
WHEN Y >= Z && Y >= X THEN Y
ELSE Z END;
Off du haut de ma tête, qui devrait fonctionner. Je ne vais pas faire de promesses sur la performance. S'il s'agissait de Microsoft SQL, je serais tenté de créer une seconde table qui stockerait les valeurs par ligne dans l'ordre, et d'avoir un Trigger configuré pour maintenir la deuxième table à jour.
Maintenant, cela ne marche évidemment que si vous avez 3 colonnes. 4 colonnes est plus d'un mal de tête, et qui est vraiment où vous devez commencer à penser une nouvelle façon de stocker les informations, comme une table comme ceci:
------------------------------
| row_id | column_id | value |
------------------------------
| 1 | 'X' | 7 |
| 1 | 'Y' | 8 |
| 1 | 'Z' | 9 |
| 2 | 'X' | 3 |
... et ainsi de suite.
Une fois que vous avez les données dans ce format, en faisant une sorte de:
SELECT row_id, value FROM TABLE ORDER BY row_id, value DESC;
devient soudainement très facile.