Из таблицы StudentDetails
СтудентПодробнее
SID Name CourseCompleted
1 Andrew CS001
1 Andrew CS002
1 Andrew CS003
2 Grey CS001
2 Grey CS005
2 Grey CS002
3 Jon CS002
3 Jon CS005
3 Jon CS008
Как создать следующий результат (курс не завершен каждым студентом)
SID Name Course Not Completed
1 Andrew CS005
1 Andrew CS008
2 Grey CS003
2 Grey CS008
3 Jon CS001
3 Jon CS003
1
Gopi
8 Сен 2010 в 16:36
У вас есть таблица всех курсов?
– Sachin Shanbhag
8 Сен 2010 в 16:43
Не нужен ли нам и полный список курсов? Так что можно сказать, что такое «незавершенное».
– CyberDude
8 Сен 2010 в 16:43
Это просто для тестирования той же таблицы, поэтому таблица курсов не требуется.
– Gopi
8 Сен 2010 в 16:58
- Значит, это просто академическое упражнение? Может показаться неправильным, что вы не можете записать информацию о студенте, пока он не закончит один курс, и что информация о модулях курса не появится, пока хотя бы один студент не завершит этот модуль.
– Martin Smith
8 Сен 2010 в 16:59
Смит ни академическое задание, ни проектное задание, головоломка не была задана
– Gopi
8 Сен 2010 в 17:03
3 ответа
Лучший ответ
select distinct a.SID, a.Name, b.CourseCompleted as `Course Not Completed`
from StudentDetails a,
(select distinct CourseCompleted from StudentDetails) b
where not exists
(select 1 from StudentDetails where SID = a.SID and CourseCompleted = b.CourseCompleted)
order by a.SID
1
Fosco
8 Сен 2010 в 16:46
select s.SID, s.Name, c.Course as [Course Not Completed]
from (select distinct CourseCompleted [Course] from StudentDetails) c,
StudentDetails s
where not exists (
select * from StudentDetails where SID=s.SID and CourseCompleted=c.Course
)
Конечно, если у вас есть таблица, в которой перечислены все возможные курсы, вы можете заменить подзапрос в предложении from
этой таблицей.
1
Blorgbeard
8 Сен 2010 в 16:46
With StudentDetails As
(
SELECT 1 SID, 'Andrew' Name, 'CS001' CourseCompleted union all
SELECT 1, 'Andrew', 'CS002' union all
SELECT 1 , 'Andrew' , 'CS003' union all
SELECT 2 , 'Grey' , 'CS001' union all
SELECT 2 , 'Grey' , 'CS005' union all
SELECT 2 , 'Grey' , 'CS002' union all
SELECT 3 , 'Jon' , 'CS002' union all
SELECT 3 , 'Jon' , 'CS005' union all
SELECT 3 , 'Jon' , 'CS008'
),
Courses AS
(
SELECT DISTINCT CourseCompleted AS Course
FROM StudentDetails
),
Students As
(
SELECT DISTINCT SID, Name
FROM StudentDetails
)
SELECT s.SID, s.name, c.Course AS [Course not Completed] FROM Students s
CROSS JOIN Courses c
EXCEPT
SELECT SID, name, CourseCompleted
FROM StudentDetails
ORDER BY s.SID, c.Course
0
Martin Smith
8 Сен 2010 в 16:53
Похожие вопросы
Новые вопросы
sql-server-2005
Используйте этот тег для вопросов, относящихся к версии 2005 Microsoft SQL Server.