SQL Server альтернатива использованию подзапроса в статистической функции - PullRequest
0 голосов
/ 03 декабря 2018

Я использую статистическую функцию для расчета среднего балла для конкретного студента.У меня есть три таблицы: КУРС, РАЗДЕЛ и ЗАПИСЬ.Эти таблицы созданы следующим образом:

create table COURSE
(
    Cno     varchar(9) primary key, 
    Cname   varchar(50),
    Credit  int check (Credit > 0)
);

create table SECTION
(
    Cno     varchar(9) REFERENCES COURSE(cno),
    Sno     varchar(9),
    Semester    varchar(15) check(Semester in('Fall','Spring','Summer')), 
    Year    int, 
    Sid     varchar(9) primary key 
);

create table ENROLL
(
    Mno     varchar(9) REFERENCES STUDENT(Mno),
    Sid     varchar(9) REFERENCES SECTION(Sid),
    Grade   CHAR check(Grade in('A','B','C','D','F')),
    primary key(Mno,Sid)
);

Я должен преобразовать Grade char в таблице ENROLL в значение с плавающей запятой.Способ расчета GPA в моем случае:

SUM(grade of each course*credit hours of the course)/SUM(credit hours of each course)

Вот как я сейчас пытаюсь вычислить GPA:

 @grade =     
(
 (select SUM(CASE 
              WHEN Grade = 'A' THEN 4.0
              WHEN Grade = 'B' THEN 3.0
              WHEN Grade = 'C' THEN 2.0
              WHEN Grade = 'D' THEN 1.0
              WHEN Grade = 'F' THEN 0.0
             END
             * (
                select c.Credit from COURSE c where c.Cno = (
                 select s.Cno from SECTION s where s.Sid in (
                  select Sid from ENROLL where Mno = @mNum
                 )
                )
             )
         ) FROM ENROLL 
         where Mno = @mNum 
 ) / (
  select SUM(Credit) from COURSE c where c.Cno = (
   select s.Cno from SECTION s where s.Sid in (
    select Sid from ENROLL where Mno = @mNum
   )
  ) group by c.Cno
 )
)

Однако существует очевидная проблема.Вы не можете иметь подзапрос внутри агрегатной функции, поэтому я был в тупике, пытаясь найти альтернативу.Любая помощь будет принята с благодарностью.

Ответы [ 2 ]

0 голосов
/ 03 декабря 2018

Я бы сначала попытался присоединиться к TABLES ENROLL и SECTION.

Это даст мне все разделы, связанные с Mno.

После этого я присоединюсь к COURSE.таблица, чтобы получить все курсы, связанные с Mno.

select * from, зарегистрируйте секцию соединения b на a.Sid = b.Sid, присоединитесь к курсу c на b.Cno = c.Cno

Тогда я сгруппируюсь по a.Mno.Это означает, что я вычисляю средний балл за Mno на основе определенных вычислений.

**SUM(grade of each course*credit hours of the course)/SUM(credit hours of each course)**

select a.Mno
       ,sum(case WHEN c.Grade = 'A' THEN 4.0
                 WHEN c.Grade = 'B' THEN 3.0
                 WHEN c.Grade = 'C' THEN 2.0
                 WHEN c.Grade = 'D' THEN 1.0
                 WHEN c.Grade = 'F' THEN 0.0
             END * c.Credit)/sum(c.credit) 
  from enroll a
  join section b
    on a.Sid=b.Sid
  join course c
    on b.Cno=c.Cno
group by a.Mno 
0 голосов
/ 03 декабря 2018

Похоже, вам просто нужно присоединиться к трем таблицам:

SELECT ENROLL.Mno, SUM(CASE
    WHEN Grade = 'A' THEN 4.0
    WHEN Grade = 'B' THEN 3.0
    WHEN Grade = 'C' THEN 2.0
    WHEN Grade = 'D' THEN 1.0
    WHEN Grade = 'F' THEN 0.0
END * COURSE.Credit) / SUM(COURSE.Credit)
FROM ENROLL
INNER JOIN SECTION ON ENROLL.Sid = Section.Sid
INNER JOIN COURSE ON SECTION.Cno = COURSE.Cno
GROUP BY ENROLL.Mno
...