麻烦订购GROUP BY,ORDER BY和JOIN

时间:2018-08-19 09:47:39

标签: sql oracle join

我在订购查询时遇到麻烦。

我有这张桌子(AttendanceLog);

ClassID | StudentPin | Status


   69           1        YES
   8            2        NO
   10           2        NO
   17           3        NO
   43           5        YES
   58           6        YES

和此表(学生):

STUDENTPIN | FNAME | LNAME | INTERNATIONAL 
     1         X       X         NO
     2         X       X         YES
     3         X       X         NO
     4         X       X         YES

我想找出哪些国际学生(Fname,Lname和StudentPIN)错过了10个或更多课程(出勤记录状态为否)。

当前,我有一个(下面的)告诉我学生密码和参加的班级数量,每个学生都没有参加过,但是我无法将两个表格合并在一起。

SELECT
    ATTENDANCELOG.studentpin,
    SUM(CASE WHEN status = 'YES' THEN 1 ELSE 0 END) AS number_of_yes,
    SUM(CASE WHEN status = 'NO' THEN 1 ELSE 0 END) AS number_of_no
FROM attendancelog
GROUP BY ATTENDANCELOG.studentpin
ORDER BY ATTENDANCELOG.studentpin

谢谢!

2 个答案:

答案 0 :(得分:0)

您可以使用联接

SELECT
    ATTENDANCELOG.studentpin,
    Students.FNAME,
    Students.LNAME,
    SUM(CASE WHEN status = 'YES' THEN 1 ELSE 0 END) AS number_of_yes,
    SUM(CASE WHEN status = 'NO' THEN 1 ELSE 0 END) AS number_of_no
FROM attendancelog
INNER JOIN Students ON Students.STUDENTPIN = attendancelog.StudentPin 
                         and INTERNATIONAL='YES' 
GROUP BY ATTENDANCELOG.studentpin, Students.FNAME, Students.LNAME
ORDER BY ATTENDANCELOG.studentpin

答案 1 :(得分:0)

加入student pin,将international = 'YES'过滤器放在where子句中,并在having子句中过滤10次以上的未命中。您还可以稍微缩短case表达式:

select a.studentpin
     , s.fname, s.lname, s.international
     , count(case a.status when 'YES' then 1 end) as attended
     , count(case a.status when 'NO'  then 1 end) as missed
from   attendancelog a
       join students s on s.studentpin = a.studentpin
where  international = 'YES' 
group  by s.fname, s.lname, s.international, a.studentpin
having count(case a.status when 'NO'  then 1 end) > 10
order  by s.fname, s.lname, a.studentpin;