2012-05-23 3 views
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; 

, я уверен, есть только то, что я с видом. Если бы кто-то другой мог любезно сказать мне, где я пошла, это будет большой помощью.

ответ

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. Если вы удалите Group By и столбцы с агрегатными функциями, вы, вероятно, увидите, что 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 с нуля.

+0

Спасибо, Томас, это немного более продвинутый, чем в тот момент, когда я нахожусь в данный момент, но на самом деле он работал чудесно. Я буду изучать его и применять его к некоторым из моих других вопросов, поскольку я продолжаю с ними, и у всех есть одна и та же конечная проблема, когда значения удваиваются. – user1412849

Смежные вопросы