|
@@ -0,0 +1,203 @@
|
|
|
+
|
|
|
+-- Current term is 1185
|
|
|
+
|
|
|
+/*
|
|
|
+The student number and name of second year students who have obtained
|
|
|
+a grade lower than 65 in at least two courses in a department with the
|
|
|
+name “computer science”.
|
|
|
+*/
|
|
|
+-- ran on empty
|
|
|
+select distinct sname, snum from student where year = 2 and snum in
|
|
|
+(
|
|
|
+ select snum from mark m1 where grade < 65 and deptcode = 'CS' and snum in
|
|
|
+ (
|
|
|
+ select snum from mark where grade < 65 and deptcode = 'CS' and snum != m1.snum
|
|
|
+ )
|
|
|
+);
|
|
|
+
|
|
|
+/*
|
|
|
+The number and name of professors who are not in the pure math (PM)
|
|
|
+department, and who are teaching CS245 for the first time.
|
|
|
+*/
|
|
|
+-- ran on empty
|
|
|
+select distinct pnum, pname from professor where deptcode not in
|
|
|
+(
|
|
|
+ select deptcode from department where deptname = 'PM'
|
|
|
+) and pnum in
|
|
|
+(
|
|
|
+ select pnum from class where deptcode = 'CS' and cnum = 245 and term = 1185
|
|
|
+) and pnum not in
|
|
|
+(
|
|
|
+ select pnum from class where deptcode = 'CS' and cnum = 245 and term != 1185
|
|
|
+);
|
|
|
+
|
|
|
+/*
|
|
|
+The number, name and year of each student who has obtained a grade in
|
|
|
+CS240 that is within 3 marks of the highest ever grade recorded for that
|
|
|
+course.
|
|
|
+*/
|
|
|
+select s.snum, s.sname, s.year from student s where s.snum in
|
|
|
+(
|
|
|
+ select snum from mark where deptcode = 'CS' and cnum = 240 and grade >= ((select grade from mark where deptcode = 'CS' and cnum = 240 order by grade desc limit 1) - 3)
|
|
|
+);
|
|
|
+
|
|
|
+/*
|
|
|
+ The number and name of students who have completed two years, who
|
|
|
+have a final grade of at least 85 in every computer science course that
|
|
|
+they have taken, and who have always been taught by a professor in the
|
|
|
+computer science (CS) department.
|
|
|
+*/
|
|
|
+select snum, sname from student where year > 2 and snum not in
|
|
|
+(
|
|
|
+ select snum from mark where deptcode = 'CS' and grade < 85
|
|
|
+) and snum not in
|
|
|
+(
|
|
|
+ select e.snum from enrollment e where exists
|
|
|
+ (
|
|
|
+ select * from class c where
|
|
|
+ c.deptcode = e.deptcode and c.cnum = e.cnum and c.term = e.term and c.section = e.section and c.pnum not in
|
|
|
+ (
|
|
|
+ select pnum from professor where deptcode != 'CS'
|
|
|
+ )
|
|
|
+ )
|
|
|
+);
|
|
|
+
|
|
|
+/*
|
|
|
+ A sorted list of all departments who do not have a professor currently
|
|
|
+teaching a course offered by a different department.
|
|
|
+*/
|
|
|
+select deptname from department where deptcode not in
|
|
|
+(
|
|
|
+ select p.deptcode from professor p where pnum in
|
|
|
+ (
|
|
|
+ select pnum from class where term = 1185 and deptcode != p.deptcode and pnum = p.pnum
|
|
|
+ )
|
|
|
+) order by deptname;
|
|
|
+
|
|
|
+/*
|
|
|
+For each pair of classes for the same course that were taught in the same
|
|
|
+term, and that where also taught by different professors: the minimum
|
|
|
+grades obtained and the maximum grades obtained. In addition to these
|
|
|
+four values, each result should include the number and name of each professor,
|
|
|
+as well as the identifying attributes for each class.
|
|
|
+*/
|
|
|
+with combineTable (grade, pname, pnum, deptcode, cnum, term, section) as
|
|
|
+(select m.grade as grade, p.pname as pname, p.pnum as pnum,
|
|
|
+ cl.deptcode as deptcode, cl.cnum as cnum, cl.term as term, cl.section as section
|
|
|
+ from mark m, enrollment e, class cl, course co, professor p
|
|
|
+ where m.snum = e.snum and m.deptcode = e.deptcode and m.cnum = e.cnum and m.term = e.term and m.section = e.section
|
|
|
+ and
|
|
|
+ cl.deptcode = e.deptcode and cl.cnum = e.cnum and cl.term = e.term and cl.section = e.section
|
|
|
+ and
|
|
|
+ cl.deptcode = co.deptcode and cl.cnum = co.cnum
|
|
|
+ and
|
|
|
+ cl.pnum = p.pnum)
|
|
|
+
|
|
|
+select
|
|
|
+(select grade from mark where deptcode = c1.deptcode and cnum = c1.cnum and term = c1.term and section = c1.section order by grade desc limit 1)
|
|
|
+,
|
|
|
+(select grade from mark where deptcode = c1.deptcode and cnum = c1.cnum and term = c1.term and section = c1.section order by grade asc limit 1)
|
|
|
+,
|
|
|
+(select grade from mark where deptcode = c2.deptcode and cnum = c2.cnum and term = c2.term and section = c2.section order by grade desc limit 1)
|
|
|
+,
|
|
|
+(select grade from mark where deptcode = c2.deptcode and cnum = c2.cnum and term = c2.term and section = c2.section order by grade asc limit 1),
|
|
|
+c1.cnum, c1.term, c1.pnum, c1.pname, c1.deptcode, c1.section, c1.pnum,
|
|
|
+c2.cnum, c2.term, c2.pnum, c2.pname, c2.deptcode, c2.section, c2.pnum
|
|
|
+from combineTable c1, combineTable c2
|
|
|
+where c1.term = c2.term and c1.deptcode = c2.deptcode and c1.cnum = c2.cnum and c1.pnum != c2.pnum;
|
|
|
+
|
|
|
+/*
|
|
|
+Pairs of distinct professors such that whenever the first one teaches a class
|
|
|
+in a particular term the second also teaches a class for the same course
|
|
|
+in the same term. Report a professor number and name for both the
|
|
|
+professors.
|
|
|
+*/
|
|
|
+select p1.pnum, p1.pname, p2.pnum, p2.pname from professor p1, professor p2
|
|
|
+ where p1.pnum != p2.pnum and not exists
|
|
|
+ (
|
|
|
+ select * from class c, class c2 where
|
|
|
+ c.pnum = p1.pnum and c2.pnum = p2.pnum and (
|
|
|
+ c.deptcode != c2.deptcode or
|
|
|
+ c.term != c2.term or
|
|
|
+ c.cnum != c2.cnum)
|
|
|
+ );
|
|
|
+-- NOW CAN USE AGGREGATION
|
|
|
+
|
|
|
+/*
|
|
|
+The course number and total enrollment count for all of its classes of each
|
|
|
+course. Also, include only those course numbers for courses with a total
|
|
|
+enrollment count among the three lowest such counts.
|
|
|
+*/
|
|
|
+-- Not sure if this will return an error, or 3 rows per old.deptcode, old.cnum since the 3rd parameter (the subquery) has 3 rows
|
|
|
+-- didn't break running on an empty dataset
|
|
|
+select old.deptcode, old.cnum, (select count(*) from enrollment where deptcode = old.deptcode and cnum = old.cnum group by deptcode, cnum order by count(*) asc limit 3) from class old;
|
|
|
+
|
|
|
+/*
|
|
|
+The percentage of professors in pure math who have always taught no
|
|
|
+more than a single course in any given term. (Note that a percentage
|
|
|
+should be a number between 0 and 100.)
|
|
|
+*/
|
|
|
+select count(*) from professor p where deptcode = 'PM' and pnum in
|
|
|
+(
|
|
|
+ select c.pnum from class c where c.pnum = p.pnum and c.pnum not in
|
|
|
+ (
|
|
|
+ select c1.pnum from class c1 where pnum = p.pnum and c1.term = c.term and (c1.deptcode != c.deptcode or c1.cnum != c.cnum)
|
|
|
+ )
|
|
|
+)
|
|
|
+/ (select count(*) from professor where deptcode = 'PM');
|
|
|
+
|
|
|
+/*
|
|
|
+The number of different third or fourth year students in each section of
|
|
|
+each course taught by a pure math professor in past terms. The result
|
|
|
+should include the professor number, professor name, course number and
|
|
|
+section, and should also be sorted first by the name of the professor,
|
|
|
+then by the professor number, third by the course number, and finally by
|
|
|
+section. (Note that a section is identified by a term and a section number.
|
|
|
+Also assume that sorting by section means sorting by term and then by
|
|
|
+section number. The result will therefore have a total of six columns.)
|
|
|
+*/
|
|
|
+-- ran on empty dataset
|
|
|
+select (select pname from professor where pnum = c.pnum), c.pnum, c.cnum, c.term, c.section,
|
|
|
+ (select count(distinct snum) from mark where snum in
|
|
|
+ (
|
|
|
+ select snum from student where year between 3 and 4
|
|
|
+ ) and deptcode = c.deptcode and cnum = c.cnum and term = c.term and section = c.section)
|
|
|
+from class c where pnum in
|
|
|
+(
|
|
|
+ select pnum from professor where deptcode = 'PM'
|
|
|
+) and term != 1185;
|
|
|
+
|
|
|
+/*
|
|
|
+The ratio of professors in pure math (PM) to professors in applied math
|
|
|
+(AM) who have taught a class in which the average grade obtained in the
|
|
|
+class was greater than 77.
|
|
|
+*/
|
|
|
+select count(*) from professor p where deptcode = 'PM' and pnum in
|
|
|
+(
|
|
|
+ (select c.pnum from class c where
|
|
|
+ (
|
|
|
+ select avg(grade) from mark where c.deptcode = deptcode and c.cnum = cnum and c.term = term and c.section = section
|
|
|
+ ) > 77)
|
|
|
+)
|
|
|
+/
|
|
|
+(select count(*) from professor p where deptcode = 'AM' and pnum in
|
|
|
+(
|
|
|
+ select c.pnum from class c where
|
|
|
+ (
|
|
|
+ select avg(grade) from mark where c.deptcode = deptcode and c.cnum = cnum and c.term = term and c.section = section
|
|
|
+ ) > 77
|
|
|
+));
|
|
|
+
|
|
|
+/*
|
|
|
+For the current term, report how many courses there are in the schedule
|
|
|
+with a particular number of classes. For example an output
|
|
|
+{[5, 1], [4, 2], [1, 5]}
|
|
|
+indicates that there are 5 courses with a single class (section), 4 courses
|
|
|
+with 2 classes, and 1 course with 5 classes scheduled in the curent term.
|
|
|
+*/
|
|
|
+-- ran on empty dataset
|
|
|
+with eachclass (sectioncount) as
|
|
|
+(select count(*) from class
|
|
|
+ where term = 1185
|
|
|
+ group by (deptcode, cnum))
|
|
|
+select count(*), sectioncount from eachclass group by sectioncount;
|