2013-06-24 136 views
1

我的數據庫中有三個表,LEFT OUTER JOIN與case條件

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

而且每個錶行每天會更新爲當前時間戳。

需要幫助確定,Mostrecentdate列應該從兩個不同的表和兩個不同的列比較這兩個列的tryptedondate和日期後獲得日期。如果在activitydata和assessmentdata中該列都爲null,那麼使用in打印學生ID如圖所示,具有最新日期的預期輸出爲空。

左外連接應與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