2016-04-28 3 views
3

У меня возникли проблемы с попыткой получить эту инструкцию sql для работы. Предполагается, что разрыв считается таким. Основной GPA рассчитывается так же, как и GPA, за исключением того, что в расчет включены только курсы от основной студентки. Например, предположим, что студент CS получил A в классе CS и B в классе Math, основной GPA учащегося - 4,0.запрос, относящийся к средним средним баллам

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

До сих пор у меня есть следующий запрос, который не полностью возвращает то, что я хочу.

select sum(value*units)/sum(units) as GPA ,f.name from faculty f 
inner join sections s on s.instructor_id = f.id 
inner join courses c on c.id=s.id 
inner join grades g on g.value =c.units 
group by f.name 

таблица я получаю

name gpa 
Art  4.00 
Bob  4.00 
Pat  3.30 
Amy  3.30 
Kim  3.30 
Sue  3.30 
Joe  2.70 
Lee  2.70 
Max 2.70 

Что почти то, что я хочу, но это показывает GPAs для студентов, которые даже не принимают каких-либо классов.

База данных выглядит

create table departments (
    id  integer primary key, 
    name varchar(255) 
); 

insert into departments (id, name) values (10, 'Computer Science'); 
insert into departments (id, name) values (20, 'Math'); 
insert into departments (id, name) values (30, 'Drama'); 

create table students (
    id    integer primary key, 
    name   varchar(255), 
    graduation_date date, 
    major_id  integer references departments(id) 
); 

insert into students (id, name, graduation_date, major_id) values 
    (1, 'Joe', null, 10); 
insert into students (id, name, graduation_date, major_id) values 
    (2, 'Amy', '2009-04-22', 20); 
insert into students (id, name, graduation_date, major_id) values 
    (3, 'Max', null, 10); 
insert into students (id, name, graduation_date, major_id) values 
    (4, 'Sue', '2009-01-10', 20); 
insert into students (id, name, graduation_date, major_id) values 
    (5, 'Bob', '2009-03-05', 30); 
insert into students (id, name, graduation_date, major_id) values 
    (6, 'Kim', null, 20); 
insert into students (id, name, graduation_date, major_id) values 
    (7, 'Art', null, 30); 
insert into students (id, name, graduation_date, major_id) values 
    (8, 'Pat', '2005-07-11', 20); 
insert into students (id, name, graduation_date, major_id) values 
    (9, 'Lee', null, 10); 

create table grades (
    id   integer primary key, 
    letter  varchar(255) not null unique, 
    value  real 
); 

insert into grades (id, letter, value) values (1, 'A', 4.0); 
insert into grades (id, letter, value) values (2, 'A-', 3.7); 
insert into grades (id, letter, value) values (3, 'B+', 3.3); 
insert into grades (id, letter, value) values (4, 'B', 3.0); 
insert into grades (id, letter, value) values (5, 'B-', 2.7); 
insert into grades (id, letter, value) values (6, 'C+', 2.3); 
insert into grades (id, letter, value) values (7, 'C', 2.0); 
insert into grades (id, letter, value) values (8, 'C-', 1.7); 
insert into grades (id, letter, value) values (9, 'D+', 1.3); 
insert into grades (id, letter, value) values (10, 'D', 1.0); 
insert into grades (id, letter, value) values (11, 'D-', 0.7); 
insert into grades (id, letter, value) values (12, 'F', 0.0); 
insert into grades (id, letter) values (13, 'CR'); 
insert into grades (id, letter) values (14, 'NC'); 

create table courses (
    id    integer primary key, 
    title   varchar(255), 
    units   integer, 
    department_id integer references departments(id) 
); 

insert into courses (id, title, units, department_id) values 
    (12, 'Databases', 4, 10); 
insert into courses (id, title, units, department_id) values 
    (22, 'Compilers', 4, 10); 
insert into courses (id, title, units, department_id) values 
    (32, 'Calculus 1', 4, 20); 
insert into courses (id, title, units, department_id) values 
    (42, 'Algebra', 4, 20); 
insert into courses (id, title, units, department_id) values 
    (52, 'Acting', 4, 30); 
insert into courses (id, title, units, department_id) values 
    (62, 'Elocution', 2, 30); 
insert into courses (id, title, units, department_id) values 
    (72, 'Calculus 2', 4, 20); 
insert into courses (id, title, units, department_id) values 
    (82, 'Topology', 4, 20); 

create table sections (
    id    integer primary key, 
    course_id  integer not null references courses(id), 
    instructor_id integer references faculty(id), 
    year   integer 
); 

insert into sections (id, course_id, instructor_id, year) values 
    (12, 12, 6, 2007); 
insert into sections (id, course_id, instructor_id, year) values 
    (13, 12, 1, 2008); 
insert into sections (id, course_id, instructor_id, year) values 
    (14, 22, 1, 2008); 
insert into sections (id, course_id, instructor_id, year) values 
    (23, 12, 6, 2009); 
insert into sections (id, course_id, instructor_id, year) values 
    (24, 22, 1, 2009); 
insert into sections (id, course_id, instructor_id, year) values 
    (32, 32, 2, 2008); 
insert into sections (id, course_id, instructor_id, year) values 
    (33, 32, 2, 2009); 
insert into sections (id, course_id, instructor_id, year) values 
    (34, 82, 2, 2009); 
insert into sections (id, course_id, instructor_id, year) values 
    (43, 32, 3, 2008); 
insert into sections (id, course_id, instructor_id, year) values 
    (51, 62, 4, 2008); 
insert into sections (id, course_id, instructor_id, year) values 
    (52, 52, 4, 2008); 
insert into sections (id, course_id, instructor_id, year) values 
    (53, 62, 4, 2009); 
insert into sections (id, course_id, instructor_id, year) values 
    (54, 52, 4, 2009); 

create table enrollment (
    id   integer primary key, 
    student_id integer not null references students(id), 
    section_id integer not null references sections(id), 
    grade_id integer references grades(id) 
); 

insert into enrollment (id, student_id, section_id, grade_id) values 
    (14, 1, 12, 8); 
insert into enrollment (id, student_id, section_id, grade_id) values 
    (15, 1, 13, 3); 
insert into enrollment (id, student_id, section_id, grade_id) values 
    (16, 1, 14, 5); 
insert into enrollment (id, student_id, section_id, grade_id) values 
    (17, 1, 32, 1); 
insert into enrollment (id, student_id, section_id, grade_id) values 
    (18, 1, 34, 2); 
insert into enrollment (id, student_id, section_id, grade_id) values 
    (19, 1, 53, 13); 
insert into enrollment (id, student_id, section_id, grade_id) values 
    (24, 3, 12, 2); 
insert into enrollment (id, student_id, section_id, grade_id) values 
    (25, 3, 14, 5); 
insert into enrollment (id, student_id, section_id, grade_id) values 
    (26, 3, 32, 1); 
insert into enrollment (id, student_id, section_id, grade_id) values 
    (27, 3, 34, 2); 
insert into enrollment (id, student_id, section_id, grade_id) values 
    (28, 3, 54, 7); 
insert into enrollment (id, student_id, section_id, grade_id) values 
    (34, 2, 43, 3); 
insert into enrollment (id, student_id, section_id, grade_id) values 
    (44, 4, 33, 4); 
insert into enrollment (id, student_id, section_id, grade_id) values 
    (54, 4, 53, 1); 
insert into enrollment (id, student_id, section_id, grade_id) values 
    (64, 6, 53, 1) 
+0

Несвязанные, но: нет волшебства или скрытой оптимизации для столбцов 'varchar' длиной 255 (или меньше). Фактическое использование пространства ** только ** зависит от значений, хранящихся в столбце, а не от максимальной длины, которую он может удерживать. –

+0

Откуда вы знаете, какие ученики не занимались в своем классе? –

+0

Нет ограничений на * основные курсы *. Вероятно, вам нужно добавить его в условие соединения: 'внутренние курсы присоединения c на c.id = s.id AND s.major_id = c.department_id' – dnoeth

ответ

0

Я попробовал ваш образец, но не может управлять, чтобы иметь тот же результат, как вы.

Я попытался это:

select st.name, sum(value*units)/sum(units) as GPA 
from sections s 
inner join enrollment e on e.section_id = s.id 
inner join students st on st.id = e.student_id 
inner join courses c on c.id=s.id 
inner join grades g on g.value =c.units 
group by st.name 

Где я фильтровать студентов и таблицы охвата, что означает, если студент не имеет курсов он не будет в результатах

Правильно ли это для вас?

+0

нет, в таблице должны быть указаны все учащиеся, и там gpas оттуда уважали майоры. поэтому мы не оцениваем оценки за пределами майоров. так что, для примера, только один класс (топология, которая является частью ее основной) и получила B + .., поэтому ее gpa - 4 (единицы) * 3.3/4 = 3.3 – henryzo

+0

@henryzo: Если вы хотите показать ученикам, если они не было никакого основного курса, но вы должны переключиться на внешние соединения. – dnoeth

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