[英]Left outer join with case condition
我的數據庫有三個表,
Studentdata with columns studentid , studentname
Assessmentdata with columns studentid, attemptedondate
Activitydata with columns studentid, date
並且每個表行都將使用當前時間戳每天進行更新。
在識別時需要幫助,在比較兩個不同的表和兩個不同的列中的這兩列trydondate和date之后,Mostrecentdate列應獲取日期。如果活動數據和評估數據中的列均為null,則在預期輸出中使用如圖所示,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
嘗試
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演示
試試這個伴侶:
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演示 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.