2009-11-09 83 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的答案中所述,但您无法轻松地在一般情况下执行此操作。如果这是一个需求,那么我会考虑重新设计模式来支持它。