需要用到的语句:cross apply
例如,各部门每月都需要在规定日期之前上报多项数据,要求在每单位的各项数据中,列出上报时间最长的一项,并列出单位,应报时间、实报时间,迟报天数,相关表如下:
部门表:T_Dept(ID, Name, Sort)
上报项目:T_Item(ID, FinishDate)
报送记录:T_List(DeptID, ItemID, SendTime)
则对应的SQL语句如下:
select t1.Name, t2.* from (
select * from T_Dept
-- 如果需要显示t2中的空白行,则取消下一行的注释
) t1 cross apply ( --(select null as empty) t outer apply (
select top 1 FinishDate, AddDate,
-- 如果有尚未上报的信息,则上报时间为当前时间
DateDiff(Day, FinishDate, coalesce(AddDate, getdate())) as OffDay
from T_Item a left join T_List b on a.ID=b.IdctID
-- 排序,以选择最大的一行数据
where b.DeptID=t1.ID order by OffDay desc
) t2