2010-04-16 63 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

相关问题