[英]Left outer join with case condition
My database has three tables, 我的数据库有三个表,
Studentdata with columns studentid , studentname
Assessmentdata with columns studentid, attemptedondate
Activitydata with columns studentid, date
And each table row will be updated every day with the current timestamp. 并且每个表行都将使用当前时间戳每天进行更新。
Need help in identifying, Mostrecentdate column should get the date after comparing both these columns attemptedondate and date from two different tables and two different columns.if the column is null in both the activitydata and assessmentdata then print the student id with in the expected output with mostrecentdate is null as shown. 在识别时需要帮助,在比较两个不同的表和两个不同的列中的这两列trydondate和date之后,Mostrecentdate列应获取日期。如果活动数据和评估数据中的列均为null,则在预期输出中使用如图所示,mostrecentdate为null。
Left outer join should be with studentdata table , where should I write this ? 左外部联接应与studentdata表一起使用,我应该在哪里写呢?
Expected output should be, 预期输出应为
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
Try 尝试
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
or 要么
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
Sample output: 样本输出:
| STUDENTID | STUDENTNAME | MOSTRECENTDATE | ------------------------------------------------- | 1 | abc | 2013-06-01 12:05:00 | | 2 | def | 2013-05-02 02:03:00 | | 3 | kjr | (null) |
Try this one mate: 试试这个伴侣:
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;
Here is the SQLFiddle Demo . 这是SQLFiddle演示 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.