1

私は宿題の2つの問題に取り組んでおり、何時間もかけて両方を解決しました。最後の問題は、両方のクエリが1つではなく2倍の数値で戻ってくることです。

これが私が持っているものです:

SELECT SUM(P.AMT_PAID) AS TOTAL_PAID, C.CITATION_ID, C.DATE_ISSUED, SUM(V.FINE_CHARGED) AS TOTAL_CHARGED
FROM PAYMENT P, CITATION C, VIOLATION_CITATION V
WHERE V.CITATION_ID = C.CITATION_ID
AND C.CITATION_ID = P.CITATION_ID
GROUP BY C.CITATION_ID;

と私の他のもの:

SELECT C.CITATION_ID, C.DATE_ISSUED, SUM(V.FINE_CHARGED) AS TOTAL_CHARGED, SUM(P.AMT_PAID) AS TOTAL_PAID, SUM(V.FINE_CHARGED) - SUM(P.AMT_PAID) AS TOTAL_OWED
FROM (CITATION C)
LEFT JOIN VIOLATION_CITATION V
ON V.CITATION_ID = C.CITATION_ID
LEFT JOIN PAYMENT P
ON P.CITATION_ID = C.CITATION_ID
GROUP BY C.CITATION_ID
ORDER BY TOTAL_OWED DESC;

私が見落としているものがあると確信しています。他の誰かが私がどこで失敗したのか教えてくれたら、それは大きな助けになるでしょう。

4

1 に答える 1

0
Select Sum(P.Amt_Paid) As Total_Paid, C.Citation_Id
    , C.Date_Issued, Sum(V.Fine_Charged) As Total_Charged
From Payment P
    Join Citation C
        On C.Citation_Id = P.Citation_Id
    Join Violation_Citation V
        On V.Citation_Id = C.Citation_Id
Group By C.Citation_Id

まず、テーブルのコンマ区切りリストを使用する代わりに、JOIN構文を使用する必要があります。読みやすく、より標準化されており、フィルタリング句を見落とすことで問題を防ぐのに役立ちます。

第二に、合計が大きすぎる理由として最も可能性が高いのは、VIOLATION_CITATIONテーブルへの結合によるものです。集計関数を使用してGroupBy列と列を削除すると、のP.AMT_PAIDインスタンスごとに繰り返されることがわかりますVIOLATION_CITATION。おそらく、以下が問題を解決します:

Select Coalesce(PaidByCitation.TotalAmtPaid,0) As Total_Paid
    , C.Citation_Id, C.Date_Issued
    , Coalesce(ViolationByCitation.TotalCharged,0) As Total_Charged
    , Coalesce(ViolationByCitation.TotalCharged,0)
        - Coalesce(PaidByCitation.TotalAmtPaid,0) As Total_Owed
From Citation As C
    Left Join   (
                Select P.Citation_Id, Sum( P.Amt_Paid ) As TotalAmtPaid
                From Payment As P
                Group By P.Citation_Id
                ) As PaidByCitation
        On PaidByCitation.Citation_Id = C.Citation_Id
    Left Join   (
                Select V.Citation_Id, Sum( V.Find_Charged ) As TotalCharged
                From Violation_Citation As V
                Group By V.Citation_Id
                ) As ViolationByCitation
        On ViolationByCitation.Citation_Id = C.Citation_Id

の使用はCoalesce、左結合が特定の値に対して行を返さない場合に、をゼロCitation_IDに置き換えることを保証することです。Null

于 2012-05-23T22:14:33.233 に答える