Сначала нужно разделить точки входа по количеству пользователей. - PullRequest
0 голосов
/ 11 июня 2018
+------------+-------+---------+---------------+
| STudent_ID | Marks | Subject | EntryPoints   |
+------------+-------+---------+---------------+
|          1 |    50 | Maths   |          10   |
|          2 |    50 | Maths   |          10   |
|          3 |    45 | Maths   |          10   |
|          1 |    30 | History |          20   |
|          2 |    30 | History |          20   |
|          3 |    30 | History |          20   |
+------------+-------+---------+---------------+

Ожидаемый результат:

+------------+-------+---------+---------------+ 
| student_id | Marks | Subject | TotalPoints   | 
+------------+-------+---------+---------------+ 
|          1 |    50 | Maths   | 5             | 
|          2 |    50 | Maths   | 5             | 
|          1 |    30 | History | 6.66          | 
|          2 |    30 | History | 6.66          | 
|          3 |    30 | History | 6.66          | 
+------------+-------+---------+---------------+ 

Подсчет общего количества баллов

По математике Вступительные баллы - 10, а максимальное количество набранных студентов - 2, поэтому 10/2 = 5 для ввода в историюколичество баллов - 20, а максимальное количество набранных студентов - 3, поэтому 20/3 = 6,66

Запрос, который я пробовал:

select student_id,marks,subject from
(
select student_id,marks,subject,dense_rank() over ( partition by subject order by marks desc) rn  from test
) t
where rn=1

Вывод:

+------------+-------+---------+ 
| Student_id | Marks | Subject | 
+------------+-------+---------+ 
|          1 |    50 | Maths   | 
|          2 |    50 | Maths   | 
|          1 |    30 | History | 
|          2 |    30 | History | 
|          3 |    30 | History | 
+------------+-------+---------+    

Я не являюськак получить столбец общего количества баллов в моем запросе

Ответы [ 2 ]

0 голосов
/ 11 июня 2018

Вы можете использовать Group by с вашим запросом для подсчета количества предметов, затем join результат с тем же запросом.

как следующий: -

Select a.student_id,a.marks,a.subject, 
Cast(a.EntryPoints as decimal ) / cast(b.CountPerSubject as decimal) TotalPoints   
from 
(
select student_id,marks,subject ,EntryPoints
    from
    (
            select student_id,marks,
            subject, EntryPoints,
            dense_rank() over ( partition by subject order by marks desc) rn  

            from test
    ) t
where rn=1
) a

Left Join
(
    select subject, count(subject) CountPerSubject
    from
    (
    select student_id,marks,subject ,EntryPoints
    from
    (
            select student_id,marks,
            subject, EntryPoints,
            dense_rank() over ( partition by subject order by marks desc) rn  

            from test
    ) t
where rn=1 ) c

group by subject) b
on a.subject =  b.subject
0 голосов
/ 11 июня 2018

Я предполагаю, что максимальная оценка является максимальной среди всех оценок по одному и тому же предмету.

SELECT 
    Student_ID
    ,Marks
    ,T.Subject
    ,CONVERT(decimal(18, 2), 
       CONVERT(float, EntryPoints)/
       CONVERT(float, COUNT(*) OVER(PARTITION BY T.Subject))) as 'TotalPoints'
  FROM @T T
  INNER JOIN (SELECT DISTINCT Subject, MAX(Marks) OVER(PARTITION BY Subject) 
  as Max_Marks FROM @T) Scores
  ON T.Subject = Scores.Subject

  WHERE Marks = Scores.Max_Marks
  ORDER BY Marks DESC, Student_ID
...