我正在尝试在asp.net中生成一个sql server数据库的报告,我将一些列的结果作为两列的产品。这是代码
comm.CommandText = "SELECT Count(Courses.CourseID) AS CourseCount, Count(Students.StudentID) AS StudentCount, Schools.Name, Schools.StartDate, Schools.SchoolFees " +
"FROM Schools" +
"LEFT JOIN Courses ON (Schools.SchoolID = Courses.SchoolID)" +
"LEFT JOIN Students ON (Schools.SchoolID = Students.SchoolID) " +
"WHERE Schools.Active = 1 " +
"GROUP BY Schools.Name, Schools.StartDate, Schools.SchoolFees";
当我运行代码时,显示结果,但“CourseCount”和“StudentCount”的列显示的值是每个列的乘积。 “CourseCount”通常为288,“StudentCount”为38但是当我运行代码时,“CourseCount”和“StudentCount”都显示10944,即38 x 288。
无论如何我可以让它们显示正确的值吗?
答案 0 :(得分:3)
将代码从使用所有行的计数更改为仅包含不同值的计数,应该返回您期望的结果
comm.CommandText = "SELECT Count(DISTINCT Courses.CourseID) AS CourseCount, Count(DISTINCT Students.StudentID) AS StudentCount, Schools.Name, Schools.StartDate, Schools.SchoolFees " +
"FROM Schools" +
"LEFT JOIN Courses ON (Schools.SchoolID = Courses.SchoolID)" +
"LEFT JOIN Students ON (Schools.SchoolID = Students.SchoolID) " +
"WHERE Schools.Active = 1 " +
"GROUP BY Schools.Name, Schools.StartDate, Schools.SchoolFees";
如果所有学校都有课程,并且所有课程都有学生
,那么返回的结果在技术上是正确的答案 1 :(得分:0)
如上所述,你是如何使用COUNT(),你要求它全部计算,这就是为什么它返回这么多。仅对要计算的两个值使用count。
答案 2 :(得分:0)
这可能比DISTINCT Count方法表现更好。
comm.CommandText =
"SELECT cc.CourseCount, sc.StudentCount, Schools.Name, Schools.StartDate, Schools.SchoolFees " +
"FROM Schools" +
"OUTER APPLY (SELECT Count(Students.StudentID) StudentCount FROM Students WHERE Students.SchoolID = Schools.SchoolID) sc " +
"OUTER APPLY (SELECT Count(Courses.CourseID) CourseCount FROM Courses WHERE Courses.SchoolID = Schools.SchoolID) cc " +
"WHERE Schools.Active = 1 ";