2010-04-16 82 views
1

我有test_scores表以下字段:最大值之間4列

表架構:

id (number) 
    score1 (number) 
    score2 (number) 
    score3 (number) 
    score4 (number) 

樣本數據:

id score1 score2 score3 score4 
1 10  05  30 50 
2 05  15  10 00 
3 25  10  05 15 

預期結果設置:

id col_name col_value 
1 score4 50 
2 score2 15 
3 score1 25 

什麼是一個很好的SQL?(我使用MySQL。)

原來的規定沒有包括在該行集中的山坳名。我是能夠得到使用下面的SQL結果:

SELECT A.id, MAX(A.score) AS max_score 
FROM  (
      SELECT id, score1 as score FROM test_scores UNION 
      SELECT id, score2 as score FROM test_scores UNION 
      SELECT id, score3 as score FROM test_scores UNION 
      SELECT id, score4 as score FROM test_scores 
     ) AS A 
GROUP BY A.id 

但引進的結果集我難倒COL_NAME的..

回答

4

我使用下面的SQL解決了這個問題:

SELECT id, GREATEST(score1, score3, score3, score4) AS col_value, 
     CASE GREATEST(score1, score3, score3, score4) 
     WHEN score1 THEN 'score1' 
     WHEN score2 THEN 'score2' 
     WHEN score3 THEN 'score3' 
     WHEN score4 THEN 'score4' 
     END AS col_name 
FROM test_scores 

Please let me know if there is a better solution. 
+0

所有這一次,我從來不知道'CASE' – 2010-04-16 23:26:17

2

對於col_value,你要使用GREATEST()

至於COL_NAME,你可以像這樣做,但它幾乎沒有優雅:解決方案(col_value)的

SELECT id, 
     IF(score1 = col_value, 'score1', 
     IF(score2 = col_value, 'score2', 
     IF(score3 = col_value, 'score3', 'score4'))) AS col_name, 
     col_value 
FROM (
    SELECT *, 
      GREATEST(score1, score2, score3, score4) AS col_value 
    FROM test_scores 
) AS helper 
1

我更喜歡使用這個case語句的可讀性,但認爲我會發布這只是踢。

select GREATEST(score1, score2, score3, score4) 
    , ELT(FIELD(GREATEST(score1, score2, score3, score4), score1, score2, score3, score4), 'score1', 'score2', 'score3', 'score4') 
from (
    select 11 score1, 6 score2, 7 score3, 8 score4 
) t 
+0

我一直在尋找像ELT(FIELD的補充)的功能。好知道的技巧。 – 2010-04-16 23:35:51

相關問題