这似乎应该很容易,但是我现在很艰难,因为我需要0个分数来计算年级,课程名称和课程时间。从技术上讲,该查询返回正确的信息,但当然不包括学生人数为0的课程/期间/年级。
SELECT
SUBSTRING(i5_schedule.course_name,1,10) "Course",
i5_schedule.Silk_period "Period",
s.grade_level,
count(distinct s.stuid) "count"
FROM
( ( ( i5_schedule i5_schedule
inner join ( ( i5_student s
inner join evi_User_Table evi_User_Table on (s.stuid = evi_User_Table.stuid) and (evi_User_Table.syr = s.syr))
inner join i5_roster i5_roster on (s.attend_dst = i5_roster.dst) and (s.attend_sch = i5_roster.sch) and (s.syr = i5_roster.syr) and (s.stuid = i5_roster.stuid) ) on i5_schedule.schedule_ID = i5_roster.schedule_ID ))
left join i5_teacher i5_teacher on (i5_schedule.teacher_ID = i5_teacher.teacher_ID) and (i5_schedule.syr = i5_teacher.syr) and (i5_schedule.dst = i5_teacher.dst) and (i5_schedule.sch = i5_teacher.sch))
WHERE
evi_User_Table.User_ID = 'A0010833' and
i5_schedule.syr = 1718 and
i5_schedule.dst = '004' and
i5_schedule.sch = '007' and
i5_schedule.teacher_ID = 5649 and
i5_schedule.silk_period = 'Per 4'
GROUP BY i5_schedule.course_name,
i5_schedule.Silk_period,
s.grade_level
ORDER BY
i5_schedule.silk_period, s.grade_level
此查询返回一行:
4/5 SHOP Per 4 06 1
我需要它返回:
4/5 SHOP Per 4 06 1
4/5 SHOP Per 4 07 0
4/5 SHOP Per 4 08 0
4/5 SHOP Per 4 09 0
等
我确实可以访问另一个名为i5_grades_taught的表,该表可以与syr,dst,sch,grades上的其他表连接。我尝试过先使用该表,然后再对其他表进行外部联接,但我无法使其正常工作!
我通过添加silk_period过滤器使此查询更简单。当我可以正常工作时,将需要它返回所有类/期间的行:
Advisory ADV 06 0
Advisory ADV 07 0
Advisory ADV 08 0
Advisory ADV 09 20
4/5 SHOP Per 4 06 1
4/5 SHOP Per 4 07 0
4/5 SHOP Per 4 08 0
4/5 SHOP Per 4 09 0
MS SHOP Per 5 06 0
MS SHOP Per 5 07 10
MS SHOP Per 5 08 1
MS SHOP Per 5 09 0
更新我尝试过的内容:
SELECT
SUBSTRING i5_schedule.course_name,1,10) "Course",
i5_schedule.Silk_period "Period",
gt.grade,
count(distinct s.stuid) "count"
FROM
i5_grades_taught gt
LEFT JOIN i5_schedule on gt.syr = i5_schedule.syr and gt.dst = i5_schedule.dst and gt.sch = i5_schedule.sch
LEFT JOIN i5_roster on i5_roster.schedule_ID = i5_schedule.schedule_ID
LEFT JOIN i5_student s on (s.attend_dst = i5_roster.dst) and (s.attend_sch = i5_roster.sch) and (s.syr = i5_roster.syr) and (s.stuid = i5_roster.stuid) and s.grade_level = gt.grade
LEFT JOIN evi_User_Table evi_User_Table on (s.stuid = evi_User_Table.stuid) and (evi_User_Table.syr = s.syr)
WHERE
evi_User_Table.User_ID = 'A0010833' and
i5_schedule.syr = 1718 and
i5_schedule.dst = '004' and
i5_schedule.sch = '007' and
i5_schedule.teacher_ID = 5649 and
i5_schedule.silk_period = 'Per 4'
GROUP BY
SUBSTRING(i5_schedule.course_name,1,10),
i5_schedule.Silk_period,
gt.grade
ORDER BY
i5_schedule.silk_period,
gt.grade
仍然不是我要找的结果。 :(
答案 0 :(得分:0)
select
SUBSTRING(i5_schedule.course_name,1,10) "Course",
i5_schedule.Silk_period "Period",
s.grade_level,
count(distinct s.stuid) "count"
from
i5_schedule
join i5_roster on i5_roster.schedule_ID = i5_schedule.schedule_ID
left join i5_student s on (s.attend_dst = i5_roster.dst) and (s.attend_sch = i5_roster.sch) and (s.syr = i5_roster.syr) and (s.stuid = i5_roster.stuid)
left join evi_User_Table evi_User_Table on (s.stuid = evi_User_Table.stuid) and (evi_User_Table.syr = s.syr)
where
evi_User_Table.User_ID = 'A0010833' and
i5_schedule.syr = 1718 and
i5_schedule.dst = '004' and
i5_schedule.sch = '007' and
i5_schedule.teacher_ID = 5649 and
i5_schedule.silk_period = 'Per 4'
group by
SUBSTRING(i5_schedule.course_name,1,10) "Course",
i5_schedule.Silk_period "Period",
s.grade_level,
count(distinct s.stuid) "count"
order by
i5_schedule.silk_period,
s.grade_level
答案 1 :(得分:0)
简单的代码似乎对我有用:
SELECT
SUBSTRING(i5_schedule.course_name,1,10) "Course",
i5_schedule.Silk_period "Period",
SUM(CASE WHEN s.grade_level = '06' then 1 else 0 end) as "G06",
SUM(CASE WHEN s.grade_level = '07' then 1 else 0 end) as "G07",
SUM(CASE WHEN s.grade_level = '08' then 1 else 0 end) as "G08",
SUM(CASE WHEN s.grade_level = '09' then 1 else 0 end) as "G09",
SUM(CASE WHEN s.grade_level = '10' then 1 else 0 end) as "G10",
SUM(CASE WHEN s.grade_level = '11' then 1 else 0 end) as "G11",
SUM(CASE WHEN s.grade_level = '12' then 1 else 0 end) as "G12"
FROM ( ( ( i5_schedule i5_schedule
inner join ( ( i5_student s
inner join evi_User_Table evi_User_Table on (s.stuid = evi_User_Table.stuid) and (evi_User_Table.syr = s.syr) )
inner join i5_roster i5_roster on (s.attend_dst = i5_roster.dst) and (s.attend_sch = i5_roster.sch) and (s.syr = i5_roster.syr) and (s.stuid = i5_roster.stuid) ) on i5_schedule.schedule_ID = i5_roster.schedule_ID ))
left join i5_teacher i5_teacher on (i5_schedule.teacher_ID = i5_teacher.teacher_ID) and (i5_schedule.syr = i5_teacher.syr) and (i5_schedule.dst = i5_teacher.dst) and (i5_schedule.sch = i5_teacher.sch))
LEFT OUTER JOIN evi_DPM_Data dpm on dpm.stuid = s.stuid and dpm.syr = s.syr and dpm.dst = s.attend_dst and dpm.sch = s.attend_sch
LEFT OUTER JOIN i5_grad_status i5_grad_status on s.syr = i5_grad_status.syr and s.attend_dst = i5_grad_status.dst and s.attend_sch = i5_grad_status.sch and s.stuid = i5_grad_status.stuid
LEFT OUTER JOIN lbl_mra_Pivot mra on mra.stuid = s.stuid
INNER JOIN i5_grades_taught gt on gt.syr = i5_schedule.syr and gt.dst = i5_schedule.dst and gt.sch = i5_schedule.sch and gt.grade = s.grade_level
WHERE evi_User_Table.User_ID = :SQL_User_Id.User_Id
and i5_schedule.syr = :parm_DD_SchoolYear.syr
and i5_schedule.dst = :parm_DD_District.District
and i5_schedule.sch = :parm_DD_School.School
and i5_schedule.teacher_ID = :parm_DD_Teacher.teacher_ID