获取';0';SQL Server/Argos复杂查询中的计数

获取';0';SQL Server/Argos复杂查询中的计数,sql,sql-server-2012,count,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 (

这看起来应该很容易,但我的日子不好过,因为我需要分数、课程名称和课程周期为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_Teached的表,该表可以连接到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

仍然不是我想要的结果(

简单的代码似乎适合我:

  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

我认为这个查询可以简化很多。你的i5_时间表表和i5_学生表中有哪些列?你有办法链接2吗?将内部连接更改为左连接。你无法获得没有学生的时间表的计数,因为你通过内部连接到学生来过滤这些列…因此…删除所有有学生的时间表没有学生匹配项。这与您的其他情况以及i5_schedule和i5_student共享这些字段相同:syr、dst、sch。我确实将所有联接更改为左联接,但仍然没有返回正确的结果。返回了与原始查询相同的结果。上面的代码仍然不起作用:第一个错误-使用组中的别名。已删除别名和计数(不同的s.stuid)group by中的行仍然只返回值大于0的记录。但是它更干净!我正在处理遗留代码,其原始程序员不再在这里描述他为什么这么做,所以我只是在大部分时间里使用它。我尝试了以下方法:使用新的查询,您会得到什么结果?相同的精确结果-仅返回s记录的结果大于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