获取';0';SQL Server/Argos复杂查询中的计数
这看起来应该很容易,但我的日子不好过,因为我需要分数、课程名称和课程周期为0。从技术上讲,此查询返回正确的信息,但当然不包括学生计数为0的课程/期间/年级获取';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 (
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