2009-11-09 115 views
0

如果我有3列,X,Y,Z,每個都是一個數字,我怎樣才能讓每一行返回最大值到最小值,然後行返回最大值到最小值?MySQL:排序行,然後排列列?

所以,如果我有:

X Y Z 
8 7 9 
1 2 3 
4 6 5 

我怎麼能拿:

9 8 7 
6 5 4 
3 2 1 

回答

1
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; 

了我的頭頂部,應該工作。我不會在表現上作出承諾。如果這是Microsoft SQL,那麼我會試着製作第二個表,按順序存儲每行的值,並設置一個觸發器來保持第二個表爲最新。

現在,如果你有3列,這顯然只會起作用。 4列更是一個頭疼的,那就是真的,你需要開始考慮爲存儲的信息,一條新的途徑,例如像這樣的表:

------------------------------ 
| row_id | column_id | value | 
------------------------------ 
| 1 | 'X'  | 7 | 
| 1 | 'Y'  | 8 | 
| 1 | 'Z'  | 9 | 
| 2 | 'X'  | 3 | 

...等等。

一旦你得到的數據以這種格式,在做某種:

SELECT row_id, value FROM TABLE ORDER BY row_id, value DESC; 

突然變得無比輕鬆。

0

您可以編寫特定數量的列,如John的答案中所述,但您無法輕鬆地在一般情況下執行此操作。如果這是一個需求,那麼我會考慮重新設計模式來支持它。

相關問題