我有一个查询所有学生计划注册的查询。当我得到所有结果时,我发现很多学生的课程注册都有多个相同课程的注册;他们有不同的结束日期和开始日期。我需要获得所有程序注册和那些具有格言结束日期的记录。我已经尝试了几个查询但是我没有得到所需的结果,相反,空值被忽略而我只获得最大记录,但是null值被忽略,不应忽略它们。有些学生注册到同一个程序,但是一个记录有一个结束日期,而另一个记录没有在结束日期得到一个空值,而在其他情况下,两个记录都有一个结束日期,在这种情况下,我应该得到最大结束日期 我正试图获得如下结果的记录。 我已经尝试了下面的查询,但似乎忽略了空值
Table #allprgms_enroll has all my program enrollments
select t1.*
-- into #MaxPrgmEndDate
from #allprgms_enroll t1
where t1.endDate =
(select MAX(t2.endDate)
from #allprgms_enroll t2
where t1.studentID = t2.studentID and
t1.programName = t2.programName
)
ORDER BY T1.StudentID
Table #allprgms_enroll
id FirstName last_name DOB program Start Date endDate
11 Aaruinq abc 01/01/1988 Science 162 2015-11-04 00:00:00.000 NULL
11 Aaruinq abc 01/01/1988 Science 162 2010-10-04 00:00:00.000 2015-08-26 00:00:00.000
12 Amber DEF 02/02/1995 Math 143 2012-10-04 00:00:00.000 2012-10-04 00:00:00.000
12 Amber DEF 02/02/1995 Math 143 2012-10-04 00:00:00.000 2016-10-04 00:00:00.000
12 Amber DEF 02/02/1995 Economics 143 2012-10-04 00:00:00.000 2016-10-04 00:00:00.000
15 Rose ghj 02/22/1995 Economics 146 2012-10-04 00:00:00.000 NULL
需要的结果
id FirstName last_name DOB program Start Date endDate
11 Aaruinq abc 01/01/1988 Science 162 2015-11-04 00:00:00.000 NULL
12 Amber DEF 02/02/1995 Math 143 2012-10-04 00:00:00.000 2016-10-04 00:00:00.000
12 Amber DEF 02/02/1995 Economics 143 2012-10-04 00:00:00.000 2016-10-04 00:00:00.000
15 Rose ghj 02/22/1995 Economics 146 2012-10-04 00:00:00.000 NULL
答案 0 :(得分:1)
这个答案使用涉及联盟的方法。工会的前半部分针对那些NULL
结束日期的人/计划组。联盟的后半部分针对那些不的人员/程序组,其结束日期为NULL
。在这种情况下,我们保留具有最大结束日期的记录。
这个问题有点棘手,因为您的要求涉及聚合,但实际上您希望保留具有NULL
值的记录。正如您所指出的,默认情况下,聚合函数将忽略NULL
个值。
SELECT id, FirstName, last_name, DOB, program,`Start Date`, endDate
FROM #allprgms_enroll
WHERE endDate IS NULL
UNION ALL
SELECT t1.id, t1.FirstName, t1.last_name, t1.DOB, t1.program,
t1.`Start Date`, t1.endDate
FROM #allprgms_enroll t1
INNER JOIN
(
SELECT id, program, MAX(endDate) AS maxEndDate
FROM #allprgms_enroll
GROUP BY id, program
HAVING SUM(CASE WHEN endDate IS NULL THEN 1 ELSE 0 END) = 0
) t2
ON t1.id = t2.id AND
t1.program = t2.program AND
t1.endDate = t2.maxEndDate
ORDER BY
id, program;