MySQL - 学生成绩列表,按奖励等级替换小成绩

时间:2014-09-23 03:01:29

标签: mysql

SELECT TestID, Grade FROM tests_points;

返回:

+--------+-------+
| TestID | Grade |
+--------+-------+
|     10 |   125 |
|     11 |   110 |
|     12 |   100 |
|     13 |    75 |
|     14 |    50 |
|     15 |    65 |
|     16 |    70 |
|     17 |   100 |
|     18 |   100 |
+--------+-------+

但是,测试ID 17和18是“奖金测试”,所以我需要用这两个替换两个较低的等级,并返回所有等级的SUM。

那么,我如何通过testID 17和18等级“替换”两个较低等级(来自TestID 14和15)。

“正确的成绩列表”将是:

+--------+-------+
| TestID | Grade |
+--------+-------+
|     10 |   125 |
|     11 |   110 |
|     12 |   100 |
|     13 |    75 |
|     14 |    100|
|     15 |    100|
|     16 |    70 |
+--------+-------+

最后我只需要所有等级的SUM,修正低等级。 SELECT SUM(等级)FROM tests_points;

我该怎么做?

3 个答案:

答案 0 :(得分:0)

以下查询可能会得到你想要的......

SELECT ttal-garba FROM 
(SELECT sum(c.grade) as garba FROM (SELECT * from tests_points  where testid < 17 order by grade asc limit 2) as c) as a,
(SELECT sum(grade) as ttal FROM tests_points) as b

(我知道......硬编码一切都很糟糕......)

答案 1 :(得分:0)

这就是你所需要的!

select testID, GREATEST(

  IF(
    grade = (select min(grade) from test_points),(select grade from test_points where testID = 17),
     grade)
  ,
    IF(grade = (select min(grade) from test_points WHERE grade > ( SELECT min(grade) FROM test_points))
     ,(select grade from test_points where testID = 18),
     grade)) as Score

from test_points 
where testID not in(17, 18)

Demo on SQLfiddle.com

答案 2 :(得分:0)

如果您只想尝试将除了底部两个以外的所有值相加,那么您可以做一些喜欢的事情,就这样。

首先添加一个新字段,让我们说test_type:

更新test_points    SET test_type ='test';

现在我们可以通过总和选择使用组。例如

SELECT test_type, (SUM(Grade) OVER (ORDER BY Grade DESC))
FROM test_Points
LIMIT 7;

这将返回所有值的总和,但它将显示7列。如果你只需要总计,将一个组扔进混合,它会将其缩小到一个字段,或者只选择第7行。