2013-06-24 5 views
1

Моя база данных имеет три таблицы,левое внешнее соединение с футляром условием

Studentdata with columns studentid , studentname 
Assessmentdata with columns studentid, attemptedondate 
Activitydata with columns studentid, date 

И каждая строка таблицы будет обновляться каждый день с текущего времени.

Нужна помощь в идентификации, столбец Mostrecentdate должен получить дату после сравнения обоих этих столбцов с попытками и даты из двух разных таблиц и двух разных столбцов. Если столбец имеет нулевое значение как в действительных данных, так и в оценочных данных, тогда распечатайте идентификатор студента с помощью ожидаемый выход с mostrecentdate равен null, как показано.

Левое внешнее соединение должно быть со столом studentdata, где я должен писать это?

Ожидаемый результат должен быть,

Studentid studentname  mostrecentdate 
1   abc   2013-06-01 12:05 
2   def   2013-05-02 02:03 
3   kjr     null 

My current query is: 
select S.StudentId, 
S.StudentAccountName, 
CASE WHEN Max(D.attemptedondate) >= Max(A.date) THEN Max(D.attemptedondate) 
    ELSE Max(A.date) END 
as MOSTRECENTDATE 
from activitydata A 
join Studentdata S on A.StudentId=s.StudentID 
join Assessmentdata D on S. StudentID =D. StudentID 
group by S.StudentId, 
S.StudentAccountName 
+1

Просьба предоставить образцы данных, которые соотносятся с вашим желаемым результатом – peterm

+0

в вашем запросе, я не смог найти столбец 'mostrecentdate' – Ravi

+0

жаль, что это самое лучшее время – user2459816

ответ

1

Попробуйте

SELECT s.studentid, s.studentname, 
     NULLIF(GREATEST(COALESCE(a.max_date, 0), 
         COALESCE(b.max_date, 0)), 0) mostrecentdate 
    FROM Studentdata s LEFT JOIN 
(
    SELECT studentid, MAX(attemptedondate) max_date 
    FROM Assessmentdata 
    GROUP BY studentid 
) a ON s.studentid = a.studentid LEFT JOIN 
(
    SELECT studentid, MAX(date) max_date 
    FROM Activitydata 
    GROUP BY studentid 
) b ON s.studentid = b.studentid 

или

SELECT s.studentid, s.studentname, mostrecentdate 
    FROM Studentdata s LEFT JOIN 
(
    SELECT studentid, MAX(max_date) mostrecentdate 
    FROM 
    (
    SELECT studentid, MAX(attemptedondate) max_date 
     FROM Assessmentdata 
    GROUP BY studentid 
    UNION ALL 
    SELECT studentid, MAX(date) max_date 
     FROM Activitydata 
    GROUP BY studentid 
) a 
    GROUP BY studentid 
) b ON s.studentid = b.studentid 

Пример вывода:

 
| STUDENTID | STUDENTNAME |  MOSTRECENTDATE | 
------------------------------------------------- 
|   1 |   abc | 2013-06-01 12:05:00 | 
|   2 |   def | 2013-05-02 02:03:00 | 
|   3 |   kjr |    (null) | 

Вот SQLFiddle демо

+0

@ user2459816 Помогло ли это? – peterm

0

Попробуйте одну родственную:

SELECT SD.StudentID 
    , SD.StudentName 
    , CASE 
     WHEN MAX(IFNULL(SS.attemptedondate, '')) >= MAX(IFNULL(AC.date, '')) THEN MAX(SS.attemptedondate) 
     WHEN MAX(IFNULL(SS.attemptedondate, '')) < MAX(IFNULL(AC.date, '')) THEN MAX(AC.date) 
     ELSE NULL 
     END AS MOSTRECENTDATE 
    FROM Studentdata SD 
    LEFT JOIN Assessmentdata SS ON SS.StudentID = SD.StudentID 
    LEFT JOIN Activitydata AC ON AC.StudentID = SD.StudentID 
    GROUP BY SD.StudentID; 

Вот является SQLFiddle Demo.