mysql - SQL,基于变量的日期X和X之间的总和

标签 mysql sql database

所以我在这个问题上有点挣扎,我在一所基于时间的学校做入门级工作。

我需要找到所有已超过注册结束日期的学生,并获得这些学生从第一次出勤日期到注册结束日期的总时数。这是我编写的代码的开头,但我知道我的 Case 是错误的。

示例学生 A 的出勤日期晚于他的契约(Contract)结束日期。

在契约(Contract)结束日期,他的总时数 = 560

完成这个项目的最低限度是 600 小时

然后,我们会向他在结束日期之前未完成的那 40 小时添加附加费。

我可以做数学,我只需要在我可以实际接触到学生的地方得到它。如果我添加诸如 Where ATD.Attendancedate >= Reg.enddate 之类的任何内容,它当然只会在结束日期之后拉几个小时。

  SELECT CONCAT('<a href="admin_view_student.jsp?studentid=', 
     CAST(SDT.studentId AS CHAR), '">', CAST(SDT.firstName AS bCHAR), ' ', 
    CAST(SDT.lastName AS CHAR), '</a>') AS Name,
    PGM.programmeName AS 'Program',
     FORMAT(SUM(ATD.duration),2) AS 'Total Hours',
    PGM.MinClockHours AS 'Program Total',
     ATD.attendancedate AS 'ATTDATE',
REG.Enddate AS 'EndDate',
Case WHEN MAX(ATD.attendancedate) >= REG.Enddate Then  Sum(ATD.duration) Between MIN(ATD.attendancedate) AND REG.enddate
ELSE NULL END AS 'Whatever' 
FROM Attendance ATD
INNER JOIN Registrations    REG ON ATD.studentId = 
      REG.studentId AND  REG.isActive = 1
INNER JOIN Programmes       PGM ON REG.programmeId 
    = PGM.programmeId AND  PGM.isActive = 1
INNER JOIN Students         SDT ON REG.studentId = 
     SDT.studentId AND SDT.isactive = 1
  WHERE
    REG.ADMINID                         AND
    REG.enrollmentSemesterId = 4000441  AND
     PGM.programmename Not like ('Careers Pathway') AND PGM.programmename Not like ('Instructor Training') AND
    ATD.subjectId IN (SELECT GSR.subjectId
            FROM CourseGroups CGP
            INNER JOIN GroupSubjectReltn GSR ON CGP.courseGroupId=GSR.courseGroupId AND GSR.isActive=1
            WHERE REG.programmeId = CGP.programmeId and CGP.isActive=1)
                                        AND
    ATD.classId IN (SELECT DISTINCT CRS.classId
            From ClassStudentReltn CRS
            Where CRS.studentId = ATD.studentId AND CRS.isActive=1)
GROUP BY SDT.lastname
ORDER BY SDT.firstName

最佳答案

您可以通过自联接非常直接地解决这个问题。您需要根据 Where ATD.Attendancedate >= Reg.enddate 选择有问题的学生,然后仅对满足该条件的学生进行计算。所以:

[your query]
inner join 
    (SELECT studentId
    FROM Attendance ATD
    inner join Registrations REG
    ON ATD.studentId = REG.studentId 
        AND  REG.isActive = 1
    WHERE ATD.Attendancedate >= Reg.enddate) as late
on [your query].studentId = late.studentId

关于mysql - SQL,基于变量的日期X和X之间的总和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45621724/

相关文章:

php - 如何更改JSON输出格式以及如何支持汉字?

javascript - 如何准备数据以使用 CKeditor 进行编辑

php - 如何根据提交的按钮执行 php 部分

php - 当我转到 codeigniter 分页中的第二页时,头文件未添加,UI 发生变化

c# - 无法将 NULL 值插入表 'ProductId' 列 'ProductDB.dbo.Brand' ;

mysql - 如何编写此结果的查询

sql - CASE WHEN 条件表达式的别名

database - 无法访问 jetty 上的/solr

android - 如何使用两个子值在 Firebase 中进行搜索?

xml - 从 XML 中提取范式