Из таблицы 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