2016-11-05 3 views
2

Чтобы рассчитать средний балл на экзамене мне нужно, чтобы получить результаты для:Получить высокие две оценки

subject1 + предмет 2 + subject3 + (сумма лучших 2scores субъекта 4, 5, 6) + (Best 2 баллов в теме 7,8,9,10,11)

некоторые предметы будут иметь нуль, как студент принимает только любые 3 из 7,8,9,10,11

Каждый экзамен определяемый экзаменом ID

Как это достичь? (Мне нужен результат, чтобы заполнить новую таблицу ... Не рамки этого вопроса)

Access 2010

Main table

+1

Данные для вырезания и вставки намного проще, чем изображения. – Fionnuala

+0

Вам нужен sql-запрос для этого –

+0

@rohit, запрос необходим для извлечения экзамена (11 предметов) ... Теперь я думаю, что я могу использовать код VBA за кнопкой или процедурой события. – Bonifacey

ответ

4

Рассмотрите возможность использования трех исходных запросов для ссылки в окончательном запросе. Сделайте заметки, знаки, которые связывают в том же ExamDateID и Темы диапазона будут подведены в расчетах:

  1. экзамена знаков для субъектов 1-3 (с использованием условной агрегации)

    SELECT e.StudentID, e.ExamDateID, 
         SUM(IIF(e.Subject BETWEEN 1 AND 3, e.Marks, NULL)) AS SumMarks123 
    FROM ExamTable AS e 
    GROUP BY e.StudentID, e.ExamDateID; 
    
  2. Знаки для экзаменов 4-6 (самые высокие два) (с использованием подзапроса)

    SELECT e.StudentID, e.ExamDateID, SUM(e.Marks) AS SumTop2Marks456 
    FROM ExamTable AS e 
    WHERE e.Subject BETWEEN 4 AND 6 
    AND (SELECT Count(*) FROM ExamTable sub 
         WHERE sub.StudentID = e.StudentID AND sub.ExamDateID = e.ExamDateID 
         AND sub.Subject BETWEEN 4 AND 6 AND sub.Marks >= e.Marks) <= 2 
    GROUP BY e.StudentID, e.ExamDateID; 
    
  3. экзамен Отмечает для субъектов 7-11 (высокий) два (с использованием подзапросов)

    SELECT e.StudentID, e.ExamDateID, SUM(e.Marks) AS SumTop2Marks711 
    FROM ExamTable AS e 
    WHERE e.Subject BETWEEN 7 AND 11 
    AND (SELECT Count(*) FROM ExamTable sub 
         WHERE sub.StudentID = e.StudentID AND sub.ExamDateID = e.ExamDateID 
         AND sub.Subject BETWEEN 7 AND 11 AND sub.Marks >= e.Marks) <= 2 
    GROUP BY e.StudentID, e.ExamDateID; 
    

Окончательный Запрос

SELECT a.StudentID, a.ExamDateID, 
     (a.SumMarks123 + b.SumTop2Marks456 + c.SumTop2Marks711) As SumScore 
FROM (ExamAvgSubj123Q a 
INNER JOIN ExamAvgSubj456Q b 
    ON (a.ExamDateID = b.ExamDateID) AND (a.StudentID = b.StudentID)) 
INNER JOIN ExamAvgSubj711Q c 
    ON (a.ExamDateID = c.ExamDateID) AND (a.StudentID = c.StudentID); 

Конечно, есть нет причин, вы не можете комбинировать все запросы int o один, но, как видно, может быть немного интенсивным для поддержания использования полученных таблиц:

SELECT a.StudentID, a.ExamDateID, 
     (a.SumMarks123 + b.SumTop2Marks456 + c.SumTop2Marks711) As SumScore  
FROM 
    ((SELECT e.StudentID, e.ExamDateID, 
      SUM(IIF(e.Subject BETWEEN 1 AND 3, e.Marks, NULL)) AS SumMarks123 
    FROM ExamTable AS e 
    GROUP BY e.StudentID, e.ExamDateID) a 

INNER JOIN 
    (SELECT e.StudentID, e.ExamDateID, SUM(e.Marks) AS SumTop2Marks456 
    FROM ExamTable AS e 
    WHERE e.Subject BETWEEN 4 AND 6 
    AND (SELECT Count(*) FROM ExamTable sub 
     WHERE sub.StudentID = e.StudentID AND sub.ExamDateID = e.ExamDateID 
     AND sub.Subject BETWEEN 4 AND 6 AND sub.Marks >= e.Marks) <= 2 
    GROUP BY e.StudentID, e.ExamDateID) b 

ON (a.ExamDateID = b.ExamDateID) AND (a.StudentID = b.StudentID)) 

INNER JOIN 
    (SELECT e.StudentID, e.ExamDateID, SUM(e.Marks) AS SumTop2Marks711 
    FROM ExamTable AS e 
    WHERE e.Subject BETWEEN 7 AND 11 
    AND (SELECT Count(*) FROM ExamTable sub 
     WHERE sub.StudentID = e.StudentID AND sub.ExamDateID = e.ExamDateID 
     AND sub.Subject BETWEEN 7 AND 11 AND sub.Marks >= e.Marks) <= 2 
    GROUP BY e.StudentID, e.ExamDateID) c 

ON (a.ExamDateID = c.ExamDateID) AND (a.StudentID = c.StudentID); 
2

EDIT: Добавлено получение двух лучших оценки

I предложите использовать VBA в событии button_click. Вот общая схема кода. Вам необходимо будет доработать его:

dim rs as DAO.recordset 
dim db as dao.database 
set db = current db 
dim qry as string 
dim avgScore as double 
avgScore = 0 
numberOfSubject = 0 

dim firstBestScore2in3 as double, firstBestScore2in3 as double 
firstBestScore2in3 = 0 
secondBestScore2in3 = 0 

dim firstBestScore2in5 as double, firstBestScore2in5 as double 
firstBestScore2in5 = 0 
secondBestScore2in5 = 0 

'query your database 
qry = _ 
"SELECT studentID, subject, marks " & _ 
"FROM exams " & _ 
"WHERE studentID = " & Me.txtStudentID & " " & _ 
"ORDER BY stubject;" 
set rs = db.opendynaset qry 

'Iterate through recordset 
Do While Not rs.EOF Then 

Select Case rs!subject 
    Case 1 To 3 
    avgScore = avgScore + rs!subject 
    Case 4 To 6 
    if (rs!subject > firstBestScore2in3) then 
    firstBestScore2in3 = rs!subject 
    elseif (rs!subject > secondBestScore2in3) then 
    secondBestScore2in3 = rs!subject 
    end if 
    Case 7 To 11 
    if (rs!subject > firstBestScore2in5) then 
    firstBestScore2in5 = rs!subject 
    elseif (rs!subject > secondBestScore2in5) then 
    secondBestScore2in5 = rs!subject 
    end if 
end case 

rs.next 
loop 

avgScore = avgScore + firstBestScore2in3 + secondBestScore2in3 + firstBestScore2in5 + secondBestScore2in5 

avgScore = avgScore/7 
+2

Также +1, даже если вы пропустите методы выбора. – Gustav

+0

Отлично! Я так благодарна щедрым добровольцам, как вы. Я всего лишь «толкаю» в изучении sql, и, как они говорят, не может победить в процессе обучения. В классе узнали только несколько простых запросов ... Пока я не ударил стену по этому поводу и не спросил ...Я, наконец, решил пойти с @parfait, рассматривая экспертов, которые советуют не хранить расчетные данные. Но потом я был в конце своего ограниченного ума ... eliteraceelephant, Большое спасибо от Кении (*); – Bonifacey

+0

@eliteraceelephant, извинения за мои небольшие знания (что, конечно, я пытаюсь увеличить) ... Но какая часть кода определяет, что вы выбираете 2 записи? не 3? ..... Также, как я интерпретирую предложение WHERE? как я могу вставить '' 'yourstudentID' ''? – Bonifacey

Смежные вопросы