2013-05-04 3 views
-1

У меня есть следующие 3 таблицы. Я хотел бы написать один запрос, чтобы получить подсчет количества курсов, зачисленных студентом на каждый уровень сложности, и общее количество курсов, зачисленных в него. Студенты, которые не зарегистрированы, также должны быть перечислены.Одиночный запрос для подсчета по категориям путем объединения нескольких таблиц

Students Table: 
Student ID  Student Name 
1    Alice 
2    Bob 
3    Charlie 
4    David 

Courses Table: 
Course ID  Course Name    Difficulty Level 
1    Arithmetic    1 
2    Advanced Calculus  3 
3    Algebra     2 
4    Trignometry    2 

Enrollment Table: 
Enrollment ID Student ID  Course ID 
1    1    1 
2    1    3 
3    1    4 
4    2    2 
5    2    3 
6    2    4 
7    3    3 

Вот ожидаемый результат:

Output: 
Student ID  Student Name Total Courses  Courses with  Courses with  Courses with 
           Enrolled In   Difficulty Level 1 Difficulty Level 2 Difficulty Level 3 
1    Alice   3     1     2     0 
2    Bob    3     0     2     1 
3    Charlie   1     0     1     0 
4    David   0     0     0     0 

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

+0

Затем разделяют ваши попытки запроса, показать нам некоторые усилия, а не просто «делать свою домашнюю работу». –

ответ

0
select s.[Student ID] 
,  s.[Student Name] 
,  count(c.[Course ID]) 
,  count(case when c.[Difficulty level] = 1 end) 
,  count(case when c.[Difficulty level] = 2 end) 
,  count(case when c.[Difficulty level] = 3 end) 
from Students s 
left join  
     Enrollment e 
on  e.[Student ID] = s.[Student ID] 
left join  
     Courses c 
on  c.[Course ID] = e.[Course ID] 
group by 
     s.[Student ID] 
,  s.[Student Name] 
+0

Большое спасибо, ребята! Андомар и Мэтт, ваши вопросы отлично работали. Результаты находятся в одной строке точно так же, как мне нужно. – user2349857

1

Это будет тянуть всех студентов, независимо, если они зарегистрированы на какие-то курсы или не

SELECT s.student_id, student_name, count(c.course_id) 
, sum(case when difficulty_level = 1 then 1 else 0 end) as level1 
, sum(case when difficulty_level = 2 then 1 else 0 end) as level1 
, sum(case when difficulty_level = 3 then 1 else 0 end) as level1 
FROM students s 
    left outer join enrollment e ON s.student_id = e.student_id 
    left outer join courses c ON e.course_id = c.course_id 
GROUP BY s.student_id, student_name 
0

Ну, не совсем то, что вы хотите, но это похоже на то, что вы хотите. Любой знающий человек может помочь мне сделать этот запрос, чтобы вернуть результат в одну строку. Понятно, что я не думаю, что мой запрос сможет получить требуемые записи в одной строке.

select s.id,s.name, 
     count(c.id) as courses, 
     case c.diff 
     when 1 then count(c.diff) else 0 
     end as "level1", 
     case c.diff 
     when 2 then count(c.diff) else 0 
     end as "level2", 
     case c.diff 
     when 3 then count(c.diff) else 0 
     end as "level3" 
from student s 
left join enrollment e 
on e.st_id=s.id 
left join course c 
on e.cr_id=c.id 
group by s.id,s.name,c.diff 

SQL FIDDLE

Как вы можете видеть на скрипке, что для «Алисе», например, информация, курсы приходит в разных строках. Для курса с неудобным уровнем 1 существует отдельный ряд и аналогично для других.

Концептуально, когда SQL-движок выбирает строки, он будет иметь только одну информацию о курсе, так что в строке он будет предоставлять информацию только для одного курса.

Может ли кто-нибудь сказать, как сделать результат одним студентом?

+0

не группируются 'c.diff' –

+0

@MattBusche. Тогда он не вернет правильные результаты. Вы можете попробовать это в скрипке. – ankurtr

+0

вам нужно выполнить агрегатную функцию на ваших столбцах 'level', например Andomar. См. Эту скрипку http://www.sqlfiddle.com/#!2/4cec9/49 –

0
SELECT s.id AS 'Student ID', s.name AS 'Student Name', COUNT(e.c_id) AS 'No of cource', 

COALESCE(SUM(c.lavel = 1),0) AS 'Difficult lavel 1', 
COALESCE(SUM(c.lavel = 2),0) AS 'Difficult lavel 2', 
COALESCE(SUM(c.lavel = 3),0) AS 'Difficult lavel 3' 

FROM students s 
LEFT JOIN enrollment e ON s.id = e.s_id 
LEFT JOIN courses c ON c.id = e.c_id 
GROUP BY s.id,s.name; 

enter image description here

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