Sql连接多个表返回两列的产品

时间:2016-05-05 13:38:01

标签: sql asp.net sql-server database

我正在尝试在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。

无论如何我可以让它们显示正确的值吗?

3 个答案:

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