2014-09-23 22 views
-1
SELECT TestID, Grade FROM tests_points; 

返回:MySQL的 - 学生成绩表,通过奖励等级代替小级

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

但是,测试ID 17和18是“奖金测试”,所以我需要更换这些两个低年级两个,并返回所有等级的总和。

那么,我怎样才能用testID 17和18等级“替换”两个较低等级(来自TestID 14和15)。

“正确的等级列表”将是:

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

最后我只是需要所有等级的总和,固定低年级。 SELECT SUM(Grade)FROM tests_points;

我怎么能这样做?

+0

我目前还没有访问mysql ..但是你可以尝试类似.. 'select testid,从tests_points开始评分,其中testid <17 order by grade asc,top 2' 应该会给你最低的2级..所以..更新他们的奖金测试分数shoud工作.. – Nokdu 2014-09-23 03:12:55

+0

我可以做到这一点轻松使用PHP后处理的成绩,但我想通过使用MySQL ... – 2014-09-23 03:14:00

+0

你在哪里想把所有等级的总和? – Awtszs 2014-09-23 03:16:37

回答

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

+0

我正在测试我的真实数据,它一直在正常工作! – 2014-09-23 04:08:09

+0

好的,我更新了答案!并且不要忘记标记答案已被接受;) – goseo 2014-09-23 04:09:01

+0

当我在本地机器上运行时,它正在工作,但在服务器上测试,它说:命令不同步;你现在不能运行这个命令,有什么与mysql版本有关的东西? – 2014-09-23 05:05:52

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 

(我知道..硬编码一切都是坏..)

+0

不完全是我期待的结果,显然,它只是忽略了其他成绩并添加了奖励等级,但在某些情况下,奖励等级并不高比正常的档次,但​​谢谢... – 2014-09-23 04:09:44

+0

@AndréSteinn所以..只是添加所有的成绩和最低的2个档次开始有什么不同? – Nokdu 2014-09-23 06:57:32

+0

导致两个奖金等级,可以低于两个小的等级,... – 2014-09-23 11:36:15

0

如果您只是想添加的所有值,除了底部有两个你可以做一些LIK,E本。

首先添加一个新的领域可以说test_type:

UPDATE test_points SET test_type = '测试';

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

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

这将返回所有值的总和,但会显示7列。如果你只想要总数,把一个组合放到组合中,它将缩小到一个场,或者只选择第7行数。