2016-05-05 2 views
1

asp.netのSQLサーバーデータベースでレポートを生成しようとしていますが、いくつかの列の結果を2つの列の積として取得しています。ここで私は、コード、結果表示を実行するコードSql 2つの列の積を返す複数のテーブルの結合

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」の両方が3894 x 288の10944と表示されます。

とにかく正しい値を表示させることができますか?

答えて

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

結果が返される期待する結果を返す必要があります個別値の数に、すべての行のカウントを使用してからあなたのコードを変更し、すべてのコースには学生がいます

+0

はうまくいきました!ありがとうございます@rossquan。 – elfico

0

上記のように、あなたはCOUNT()をどのように使用しているのですか?すべてを数えることを求めています。カウントする2つの値だけでカウントを使用します。

0
これは、個別のカウント方法よりも良好に機能かもしれません

..

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 "; 
関連する問題