0

Student、StudentPayment、CreditAmount という名前の 3 つのテーブルがあります。生徒が学校にいくら借りているかという結果を示したいと思います。Student テーブルには、TotalPayable という名前の列があり、これは学校に支払われる合計金額です。StudentPayment には、TotalPaid という名前の列があります。これは、彼が行ったたびの支払いの合計です。CreditAmount テーブルには、CreditAmount という名前の列があります。学校が学生に与える免除額です。だから私はクエリを作成しました:

SELECT Student.TotalPayableAmount - 
       Sum(StudentPayment.TotalPaid, CreditAmount.WaiverAmount) AS Total_Due
  FROM (Student INNER JOIN StudentPayment ON Student.ID = StudentPayment.ID) 
 INNER JOIN CreditAmount ON (Student.ID = CreditAmount.ID) AND (Student.ID = CreditAmount.StudentID)
 GROUP BY Student.ID, Student.TotalPayableAmount, CreditAmount.WaiverAmount 

しかし、それはエラーを示しています。

実際には、TotalPaid と CreditAmount の SUM を作成し、それを Student テーブルの TotalPayable から減算したいと考えています。誰でもこれについて私を助けてくれませんか。前もって感謝します。

4

2 に答える 2

5

joinは、右側の各行に対して左側の各行を繰り返します。したがって、2回の支払いと3回のクレジットを持つ学生は、最終的に6行になります。それをsum超えると、間違った結果が得られます。

代わりに、サブクエリを使用して、学生1人あたりの合計金額を計算できます。サブクエリは生徒ごとに1行しか返さないため、上記の行の重複の問題を回避できます。例えば;

select  Student.ID
,       Student.TotalPayableAmount - 
        iif(StudentPayment.TotalPaid is null, 0, StudentPayment.TotalPaid) -
        iif(CreditAmount.WaiverAmount is null, 0, CreditAmount.WaiverAmount)
from    (
        Student
        left join    
                (
                select  StudentID
                ,       sum(Paid) as TotalPaid
                from    StudentPayment
                group by
                        StudentID
                ) as StudentPayment
        on    StudentPayment.StudentID = Student.ID
        )
left join    
        (
        select  StudentID
        ,       sum(Waiver) as WaiverAmount
        from    CreditAmount
        group by
                StudentID
        ) as CreditAmount
on      CreditAmount.StudentID = Student.ID
于 2012-12-09T10:21:17.570 に答える
2

各テーブルの合計を個別に取得してから、学生IDで結合する必要があります。

SELECT Student.TotalPayableAmount - Nz(sumTotalPaid,0) - Nz(sumCreditAmount,0)
FROM (Student
LEFT JOIN (
    SELECT ID, Sum(TotalPaid) AS sumTotalPaid
    FROM StudentPayment
    GROUP BY StudentPayment.ID
) AS sum1
    ON Student.ID = sum1.ID)
LEFT JOIN (
    SELECT ID, Sum(CreditAmount) AS sumCreditAmount
    FROM CreditAmount
    GROUP BY CreditAmount.ID
) AS sum2
    ON Student.ID = sum2.ID

注:これを外部接続(DAO、ADO、ADO.NET)から実行している場合、この関数は使用できませんNz

于 2012-12-09T10:16:42.000 に答える