0

SQL Serverに少し夢中になっているタスクがあり、誰かが助けてくれるかどうか疑問に思っています。

タスク:
データベース内で、という名前のストアドプロシージャを作成する必要がありますClassRegistration。このストアドプロシージャの結果セットの列は、次のとおりである必要があります。

  1. [Class]–教えら​​れるクラスの名前
  2. [Teacher Name]-クラスを教えている人の名前
  3. [Registrations]-クラスを受講するために登録した生徒の数
  4. [Number Paid]-クラスの料金を支払った生徒の数

テーブル:

  1. [Teacher]Teacher_ID(PK)、TeacherName
  2. [Class]Class_ID(PK)ClassName、、Teacher_ID(FK)
  3. [ClassRegistration] Student_ID(FK)、Class_ID(FK)、HasPaidFees
  4. [Student] Student_ID(PK)、StudentName

まだ誰も登録していない場合でも、大学はすべてのクラスについて知る必要があります。

これまでの私のSQL:

Create  PROCEDURE ClassRegistration
AS
SELECT DISTINCT 
    c.ClassName, 
    t.TeacherName, 
    COUNT(cr.Student_ID) As Registrations, 
    COUNT(case when cr.HasPaidFees = 1 then 1 else null end) As NumberPaid
FROM 
    Class As c, 
    Teacher As t, 
    ClassRegistration As cr, 
    Student As s
WHERE
    (c.Class_ID = cr.Class_ID) 
AND (cr.Student_ID = s.Student_ID)
GROUP BY c.ClassName, t.TeacherName

ストアドプロシージャを正常に作成できますが、出力が正しくないように見えます。助けていただければ幸いです:)。

4

2 に答える 2

1

登録がない場合でもクラスを見つける必要がある場合は、left outer join:を使用する必要があります。

SELECT  Distinct c.ClassName, t.TeacherName, COUNT(cr.Student_ID) As Registrations, COUNT(case when cr.HasPaidFees = 1 then 1 else null end) As NumberPaid
FROM    Class As c
INNER JOIN Teacher As t
on c.Teacher_ID = t.Teacher_ID
LEFT OUTER JOIN ClassRegistration As cr
ON (c.Class_ID = cr.Class_ID)
INNER JOIN Student As s
ON  (cr.Student_ID = s.Student_ID)
GROUP BY c.ClassName, t.TeacherName

(他の結合を次のように書き直したことに注意してくださいINNER JOIN

于 2012-09-23T18:11:20.243 に答える
1

Studentに参加する理由はなく、テーブルは4つありますが、参加基準は2つだけです。これは、適切な明示的な結合の代わりに古いtable,table結合構文を使用する際の落とし穴の1つです。私も:

  • 「内部」テーブルを最初にリストしました
  • dbo.テーブル参照にプレフィックスを追加
  • SET NOCOUNT ON手順に追加
  • 不要なものを削除しましたDISTINCT
  • CASE式を簡略化
CREATE PROCEDURE dbo.ClassRegistration
AS
BEGIN
  SET NOCOUNT ON;

  SELECT c.ClassName, t.TeacherName, 
    COUNT(cr.Student_ID) As Registrations, 
    COUNT(NULLIF(cr.HasPaidFees, 0)) As NumberPaid
  FROM dbo.Class As c
  INNER JOIN dbo.Teacher As t
  ON t.Teacher_ID = c.Teacher_ID
  LEFT OUTER JOIN dbo.ClassRegistration As cr
  ON c.Class_ID = cr.Class_ID
  GROUP BY c.ClassName, t.TeacherName;
END
GO
于 2012-09-23T18:12:26.637 に答える