2012-02-15 3 views
1

Для задания домашней работы я должен написать запрос MySQL для вычисления GPA каждого ученика в таблице базы данных. Я разбил проблему на 3 части: (1) вычислил количество баллов, полученных каждым учеником, (2) вычислил количество полученных кредитов, а затем (3) разделил баллы по кредитам. Вот запросы я написал для выполнения шагов 1 и 2: точкиМанипулирование результатами из двух подзапросов в MySQL

  1. Рассчитайте класс заработал:

    SELECT ID, SUM(credits) AS credits_taken 
    FROM takes 
    NATURAL JOIN course 
    GROUP BY ID 
    

2 Поиск точек класса заработал:

SELECT ID, SUM(credits * (SELECT points FROM gradepoint WHERE letter = grade)) AS tot_grade_points 
    FROM takes NATURAL JOIN course 
    GROUP BY ID 

I вручную оценили каждый запрос и вернули правильные результаты. Но я не могу понять, как вернуть (credits_taken/tot_grade_points) для каждого ученика. Вот то, что я пробовал:

SELECT ID, GPA 
    FROM student AS S NATURAL JOIN 
      (SELECT ID,('credits_taken'/SUM(credits * (SELECT points FROM gradepoint WHERE letter = grade))) AS GPA 
      FROM takes AS T1 NATURAL JOIN course 
      WHERE S.ID = T1.ID 
      AND EXISTS (
          SELECT ID, SUM(credits) AS 'credits_taken' 
          FROM takes AS T2 NATURAL JOIN course 
          WHERE S.ID = T2.ID 
          GROUP BY ID 
         ) 
      GROUP BY ID) Z 
    GROUP BY ID 

Но это дает мне ошибку «Неизвестный столбец„S.ID“в„где предложение“». Из того, что я прочитал, вы не можете ссылаться на псевдоним таблицы из подзапроса в операции соединения. У кого-нибудь есть другой способ сделать расчет этих двух подзапросов и вернуть их привязанным к идентификатору студента?

Таблицы «берет» сопоставляют студенческие идентификаторы с информацией о курсах, которые они взяли, и, самое главное, курс и класс. В таблице «курс» содержится поле «кредиты», количество кредитов, которые курс стоит.

EDIT

Вот соответствующие структуры таблиц:

принимает:

Field  | Type   | Null | Key | Default | Extra | 
    +-----------+--------------+------+-----+---------+-------+ 
    | ID  | varchar(5) | NO | PRI |   |  | 
    | course_id | varchar(8) | NO | PRI |   |  | 
    | sec_id | varchar(8) | NO | PRI |   |  | 
    | semester | varchar(6) | NO | PRI |   |  | 
    | year  | decimal(4,0) | NO | PRI | 0  |  | 
    | grade  | varchar(2) | YES |  | NULL |  | 
    +-----------+--------------+------+-----+---------+-------+ 

курс:

+-----------+--------------+------+-----+---------+-------+ 
    | Field  | Type   | Null | Key | Default | Extra | 
    +-----------+--------------+------+-----+---------+-------+ 
    | course_id | varchar(8) | NO | PRI |   |  | 
    | title  | varchar(50) | YES |  | NULL |  | 
    | dept_name | varchar(20) | YES | MUL | NULL |  | 
    | credits | decimal(2,0) | YES |  | NULL |  | 
    +-----------+--------------+------+-----+---------+-------+ 
+0

Какая колонка идентификатора на курсе таблицы, к которой вы хотите присоединиться, называется Takes? Это идентификатор? Было бы полезно разместить структуру столбцов из трех таблиц. – dash

+0

Удалите апострофы из 'credits_taken' (который является строкой) в credits_taken/SUM (...) и повторите попытку. –

+0

Когда я удаляю апострофы, он говорит Неизвестный столбец «credits_taken» в «списке полей». – Matt

ответ

1

Я хотел бы попробовать:

SELECT takes.sec_id, 
    SUM(course.credits * gradepoint.points)/SUM(course.credits) AS GPA 
FROM takes 
JOIN gradepoint ON takes.grade = gradepoint.letter 
JOIN course ON takes.course_id = course.course_id 
GROUP BY takes.sec_id 

Поскольку ваше описание структуры таблицы неполное, мне пришлось угадать схему градации и я предположил, что sec_id идентифицирует ученика в таблице takes, если есть другой столбец для этого, просто замените его в запросе как в SELECT, так и в GROUP BY частях. Возможно, это идентификатор, но такое имя столбца обычно используется для первичных ключей. Или, возможно, первичных ключей не определено вообще, что в любом случае является плохой практикой. Также вам нужно будет присоединиться к таблице student, если вы хотите получить информацию о студенте, отличную от id, например имя и т. Д.

Я бы также рекомендовал использовать синтаксис JOIN ... ON ... вместо NATURAL JOIN, и он не только более читабельен, но и дает больше гибкости, например, см., Как соединяется градация, вместо использования дорогостоящего зависимого подзапроса.

+0

Большое спасибо, это сработало отлично.Я не знал о синтаксисе JOIN ON (мы еще не получили этого.) Еще раз спасибо! – Matt