简体   繁体   English

左外连接与情况

[英]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) |

Here is SQLFiddle demo 这是SQLFiddle演示

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM