SQL - 按组除以和

时间:2014-05-09 21:13:53

标签: sql oracle

我正在学习SQL,并且在创建自定义报告时遇到了问题。我正在处理学校的出勤数据。我想创建一个报告,为每种缺席类型提供会员日和天数。

我已经成功地为这些创建了一份报告。

会员日(通过计算学校入学日期和当前日期之间的学校日数计算。会员日不作为一个字段存在)

SELECT sum(case when cd.DATE_VALUE >= s.ENTRYDATE and cd.DATE_VALUE <= current_timestamp THEN cd.INSESSION ELSE 0 END), s.LASTFIRST
FROM CALENDAR_DAY cd,STUDENTS s
WHERE cd.SCHOOLID = 405
GROUP BY s.LASTFIRST

每次缺席类型

SELECT s.STUDENT_NUMBER, s.LASTFIRST,SUM(CASE WHEN a.ATTENDANCE_CODEID = 2 THEN 1 ELSE 0 END),SUM(CASE WHEN a.ATTENDANCE_CODEID = 4 THEN 1 ELSE 0 END),SUM(CASE WHEN a.ATTENDANCE_CODEID = 3 THEN 1 ELSE 0 END),SUM(CASE WHEN a.ATTENDANCE_CODEID = 51 THEN 1 ELSE 0 END)
FROM ATTENDANCE a
INNER join STUDENTS s
ON a.STUDENTID = s.ID
WHERE a.att_date between '%param1%'  and  '%param2%'
GROUP BY s.STUDENT_NUMBER, s.LASTFIRST

问题在于,如果我尝试将这些内容放在同一份报告中,会员日数乘以学生因加入学生和出勤而出现在考勤表中的次数。我对解决方案的想法就是划分这一行

sum(case when cd.DATE_VALUE >= s.ENTRYDATE and cd.DATE_VALUE <= current_timestamp THEN cd.INSESSION ELSE 0 END)

根据学生出现在考勤表中以抵消每条线路上存在的学生信息的次数。我无法弄清楚如何做到这一点。我不太了解这些类型的问题,所以我希望我走错了轨道并且有一个简单的解决方案。感谢。

1 个答案:

答案 0 :(得分:0)

您的问题是一个常见问题 - 尝试在不使用子查询的情况下同时沿两个维度进行汇总。您希望使用两个聚合子查询执行此查询。像这样:

SELECT *
FROM (SELECT sum(case when cd.DATE_VALUE >= s.ENTRYDATE and cd.DATE_VALUE <= current_timestamp 
                     THEN cd.INSESSION
                     ELSE 0
                 END), s. STUDENT_NUMBER
      FROM CALENDAR_DAY cd CROSS JOIN
           STUDENTS s
      WHERE cd.SCHOOLID = 405
      GROUP BY s.STUDENT_NUMBER
     ) sc JOIN
     (SELECT s.STUDENT_NUMBER, s.LASTFIRST,
             SUM(CASE WHEN a.ATTENDANCE_CODEID = 2 THEN 1 ELSE 0 END),
             SUM(CASE WHEN a.ATTENDANCE_CODEID = 4 THEN 1 ELSE 0 END),
             SUM(CASE WHEN a.ATTENDANCE_CODEID = 3 THEN 1 ELSE 0 END),
             SUM(CASE WHEN a.ATTENDANCE_CODEID = 51 THEN 1 ELSE 0 END)
      FROM ATTENDANCE a INNER join
           STUDENTS s
           ON a.STUDENTID = s.ID
      WHERE a.att_date between '%param1%'  and  '%param2%'
      GROUP BY s.STUDENT_NUMBER, s.LASTFIRST
     ) sa
     on sc.STUDENT_NUMBER = sa.STUDENT_NUMBER;