String lsSql = "SELECT cs.ClassScheduleId, c.EDCId, c.ClassName, c.ClassId, c.TutorId, c.StartDate, c.EndDate, "
                + "(SELECT COUNT(*) FROM tblClassSchedules WHERE EDCId = c.EDCId AND ClassId = c.ClassId) As Sessions, "
                + "dbo.EDCFnClassDay(cs.EDCId, cs.ClassId) as Day, "
                + "cs.Date, cs.StartTime, c.Duration, cs.ClassroomId, "
                + "(SELECT COUNT(*) FROM tblAttendances WHERE ClassScheduleId = cs.ClassScheduleId) As Atd, "                + "CAST( "
                + "(SELECT COUNT(*) FROM tblAttendances WHERE ClassScheduleId = cs.ClassScheduleId) "
                + "* "
                + "CAST(100 as decimal(18,5)) "
                + "/ "
                + "(SELECT COUNT(*) FROM tblEnrolls WHERE EDCId = cs.EDCId AND ClassId = cs.ClassId) "
                + "AS decimal(18,5)) As Atd_pct, "                + "CASE  "
                + "WHEN DATEDIFF(d, cs.Date, GETDATE()) >=0 THEN "
                + " (SELECT COUNT(*) FROM tblEnrolls WHERE EDCId = cs.EDCId AND ClassId = cs.ClassId) "
                + " - "
                + " (SELECT COUNT(*) FROM tblAttendances WHERE ClassScheduleId = cs.ClassScheduleId) "
                + "ELSE "
                + " 0 "
                + "END As Abs, "                + "CASE  "
                + "WHEN DATEDIFF(d, cs.Date, GETDATE()) >=0 THEN "
                + " ( "
                + " (SELECT COUNT(*) FROM tblEnrolls WHERE EDCId = cs.EDCId AND ClassId = cs.ClassId) "
                + " - "
                + " (SELECT COUNT(*) FROM tblAttendances WHERE ClassScheduleId = cs.ClassScheduleId) "
                + " ) "
                + " * "
                + " CAST(100 as decimal(18,5)) "
                + " / "
                + " (SELECT COUNT(*) FROM tblEnrolls WHERE EDCId = cs.EDCId AND ClassId = cs.ClassId) "
                + "ELSE "
                + " 0.00 "
                + "END As Abs_pct, "                + "dbo.EDCFnClassAbsStudent(cs.ClassScheduleId, GETDATE()) As Abs_Stu_Id "                + "FROM tblClassSchedules cs "
                + "INNER JOIN tblClasses c ON cs.EDCId = c.EDCId AND cs.ClassId = c.ClassId 
出现错误为"Divide by zero error encountered."
也就是除数为 0 了 
请问这么去修改???

解决方案 »

  1.   

    ISNULL(NULLIF((select count(*) .....),0),1)这样处理一下。对于做分母的查询的值,用之.比如x / ISNULL(NULLIF((select count(*) from tb),0),1)当然,也可以用case when
      

  2.   

            String lsSql = "SELECT cs.ClassScheduleId, c.EDCId, c.ClassName, c.ClassId, c.TutorId, c.StartDate, c.EndDate, "
                    + "(SELECT COUNT(*) FROM tblClassSchedules WHERE EDCId = c.EDCId AND ClassId = c.ClassId) As Sessions, "
                    + "dbo.EDCFnClassDay(cs.EDCId, cs.ClassId) as Day, "
                    + "cs.Date, cs.StartTime, c.Duration, cs.ClassroomId, "
                    + "(SELECT COUNT(*) FROM tblAttendances WHERE ClassScheduleId = cs.ClassScheduleId) As Atd, "                + "CAST( "
                    + "(SELECT COUNT(*) FROM tblAttendances WHERE ClassScheduleId = cs.ClassScheduleId) "
                    + "* "
                    + "CAST(100 as decimal(18,5)) "
                    + "/ "
                    + "(SELECT CASE WHEN COUNT(*)=0 THEN 1 ELSE COUNT(*) END FROM tblEnrolls WHERE EDCId = cs.EDCId AND ClassId = cs.ClassId) "
                    + "AS decimal(18,5)) As Atd_pct, "                + "CASE  "
                    + "WHEN DATEDIFF(d, cs.Date, GETDATE()) >=0 THEN "
                    + " (SELECT COUNT(*) FROM tblEnrolls WHERE EDCId = cs.EDCId AND ClassId = cs.ClassId) "
                    + " - "
                    + " (SELECT COUNT(*) FROM tblAttendances WHERE ClassScheduleId = cs.ClassScheduleId) "
                    + "ELSE "
                    + " 0 "
                    + "END As Abs, "                + "CASE  "
                    + "WHEN DATEDIFF(d, cs.Date, GETDATE()) >=0 THEN "
                    + " ( "
                    + " (SELECT COUNT(*) FROM tblEnrolls WHERE EDCId = cs.EDCId AND ClassId = cs.ClassId) "
                    + " - "
                    + " (SELECT COUNT(*) FROM tblAttendances WHERE ClassScheduleId = cs.ClassScheduleId) "
                    + " ) "
                    + " * "
                    + " CAST(100 as decimal(18,5)) "
                    + " / "
                    + " (SELECT CASE WHEN COUNT(*)=0 THEN 1 ELSE COUNT(*) END FROM tblEnrolls WHERE EDCId = cs.EDCId AND ClassId = cs.ClassId) "
                    + "ELSE "
                    + " 0.00 "
                    + "END As Abs_pct, "                + "dbo.EDCFnClassAbsStudent(cs.ClassScheduleId, GETDATE()) As Abs_Stu_Id "                + "FROM tblClassSchedules cs "
                    + "INNER JOIN tblClasses c ON cs.EDCId = c.EDCId AND cs.ClassId = c.ClassId
      

  3.   

    SELECT COUNT(*) FROM tblEnrolls WHERE EDCId = cs.EDCId AND ClassId = cs.ClassIdSELECT CASE WHEN COUNT(*)=0 THEN 1 ELSE COUNT(*) END FROM tblEnrolls WHERE EDCId = cs.EDCId AND ClassId = cs.ClassId这两个count有可能为0
      

  4.   

        + "(SELECT CASE WHEN COUNT(*)=0 THEN 1 ELSE COUNT(*) END FROM tblEnrolls WHERE EDCId = cs.EDCId AND ClassId = cs.ClassId) "
        + "AS decimal(18,5)) As Atd_pct, "
     这样些好像还是不行哦??
      

  5.   

    少了cast?
        + "cast((SELECT CASE WHEN COUNT(*)=0 THEN 1 ELSE COUNT(*) END FROM tblEnrolls WHERE EDCId = cs.EDCId AND ClassId = cs.ClassId) " 
        + "AS decimal(18,5))) As Atd_pct, " 
      

  6.   

    出现空记录,需做处理isnull(字段,'')