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 테이블에 대한 조인 때문입니다. 그룹화 기준 및 집계 함수가있는 열을 제거하면 각 인스턴스에 대해 에 대해 P.AMT_PAID이 반복되는 것을 볼 수 있습니다. 아마, 다음과 같은 문제를 해결할 수 :

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의 사용을 보장하는 것입니다 왼쪽은 우리가 제로로 Null를 교체하는 것이 주어진 Citation_ID 값을 반환에게 행이 참여하지 않는 경우.

+0

감사합니다. 토마스, 그건 제가 지금있는 곳보다 조금 더 진보되었지만 실제로는 훌륭하게 작동했습니다. 나는 그것들을 연구 할 것이고 나는 그들과 함께 진행되어 왔고 다른 것들 모두 값이 두 배가되는 동일한 최종 문제를 가지고 있기 때문에 다른 질문들 중 일부에 적용 할 것이다. – user1412849