簡體   English   中英

左外連接與情況

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM