【问题标题】:Sql Joins on multiple table returning product of two columns多个表上的 Sql Joins 返回两列的乘积
【发布时间】:2016-05-05 13:38:00
【问题描述】:

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

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

【问题讨论】:

    标签: sql asp.net sql-server database


    【解决方案1】:

    将您的代码从使用所有行的计数更改为仅使用不同值的计数,应该会返回您期望的结果

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

    如果所有学校都有课程,并且所有课程都有学生,则返回的结果在技术上是正确的

    【讨论】:

    • 工作得很好!非常感谢@rossquan。
    【解决方案2】:

    如上所述,这就是您使用 COUNT() 的方式,您要求它计数所有,这就是它返回这么多的原因。仅对要计算的两个值使用 count。

    【讨论】:

      【解决方案3】:

      这可能比 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 ";
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-03-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-03-22
        • 1970-01-01
        相关资源
        最近更新 更多