2013-08-02 31 views
9

Tôi muốn thêm điểm vào các điểm cao nhất. bàn của tôi làThêm điểm cụ thể vào các điểm cao nhất

enter image description here

Tôi cố gắng để cung cấp cho các điểm trên Cao nhất 3 vết của một sinh viên. 1st Marks cao nhất đi đến 5 điểm, Marks cao nhất thứ 2 đi vào 3 Marks và 3 cao nhất đi tới 1 vết

Tôi đang sử dụng mã này để lựa chọn Marks cao nhất,

select t1.ID, t1.Name, t1.Section, t1.Marks from myTable t1 join 
(select Section, substring_index(group_concat 
(distinct Marks order by Marks desc), ',', 3) as Marks3 
from myTable group by Section) tsum on t1.Section = tsum.Section 
    and find_in_set(t1.Marks, tsum.Marks3) > 0 ORDER BY Section, Marks DESC, ID Desc 

Tôi muốn thêm 5 điểm cho giá trị higest đầu tiên, 3 điểm cho điểm cao thứ 2 và 1 điểm cho Điểm cao thứ 3. Dấu trùng lặp có thể xảy ra cho sinh viên.

Vui lòng tham khảo http://www.sqlfiddle.com/#!2/dca0c/1

Vì vậy, kết quả cuối cùng của tôi

enter image description here

Xin hãy giúp tôi ..

+0

+1 cho một câu hỏi tốt đẹp và cho những nỗ lực mà bạn đã đặt vào nó –

Trả lời

1
select t1.ID, t1.Name, t1.Section, t1.Marks, 
case ((SELECT COUNT(distinct MARKS) FROM students t2 WHERE t2.marks > t1.marks 
and t1.Section = t2.Section) +1) when 1 then 5 when 2 then 3 else 1 end as Points 
from students t1 join 
    (select Section, substring_index(group_concat(distinct Marks order by Marks desc), ',', 3) as Marks3 
     from students 
     group by Section 
    ) tsum 
    on t1.Section = tsum.Section and 
     find_in_set(t1.Marks, tsum.Marks3) > 0 
ORDER BY Section, Marks DESC, ID ASC; 

Output: Đúng như nhu cầu của bạn. ;)

ID NAME SECTION MARKS POINTS 
1 S1 class1 55 5 
7 S7 class1 32 3 
3 S3 class1 25 1 
10 S10 class2 78 5 
14 S14 class2 78 5 
6 S6 class2 66 3 
2 S2 class2 33 1 
13 S13 class2 33 1 
4 S4 class3 65 5 
11 S11 class3 65 5 
5 S5 class3 43 3 
12 S12 class3 43 3 
15 S15 class3 25 1 

fiddle

3

CẬP NHẬT Bạn có thể làm điều đó như thế này

SELECT id, name, section, marks, 
     CASE rank WHEN 1 THEN 5 
       WHEN 2 THEN 3 
       WHEN 3 THEN 1 
       ELSE 0 
     END points 
    FROM 
(
    SELECT s.*, @n := IF(@s = section, IF(@m = marks, @n, @n + 1), 1) rank, @m := marks, @s := section 
    FROM students s, (SELECT @n := 0) i 
    ORDER BY section, marks DESC 
) q 
HAVING points > 0 

Output:

 
| ID | NAME | SECTION | MARKS | POINTS | 
---------------------------------------- 
| 1 | S1 | class1 | 55 |  5 | 
| 7 | S7 | class1 | 32 |  3 | 
| 3 | S3 | class1 | 25 |  1 | 
| 10 | S10 | class2 | 78 |  5 | 
| 14 | S14 | class2 | 78 |  5 | 
| 6 | S6 | class2 | 66 |  3 | 
| 2 | S2 | class2 | 33 |  1 | 
| 13 | S13 | class2 | 33 |  1 | 
| 4 | S4 | class3 | 65 |  5 | 
| 11 | S11 | class3 | 65 |  5 | 
| 5 | S5 | class3 | 43 |  3 | 
| 12 | S12 | class3 | 43 |  3 | 
| 15 | S15 | class3 | 25 |  1 | 

Đây là SQLFiddle bản demo

+0

Bất kỳ truy vấn lọc sẵn để lọc ra các hồ sơ có '0' điểm? –

+0

đã được chơi xung quanh fiddle của bạn. Không nhận được mặc dù. –

+0

@PraveenPrasannan Xem câu trả lời được cập nhật và sqlfiddle để lọc ra các hàng có 0 điểm. – peterm