在复杂的查询SQL Server / Argos中获取“ 0”计数

时间:2018-08-23 16:19:27

标签: sql sql-server-2012 count

这似乎应该很容易,但是我现在很艰难,因为我需要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

仍然不是我要找的结果。 :(

2 个答案:

答案 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