Mysql 总和在查询中相乘

Mysql 总和在查询中相乘,mysql,Mysql,我正在做两道作业,几个小时后,我几乎把它们都解决了,最后一个问题是,我的两个查询返回的数值都是双倍的,而不是一个 以下是我所拥有的: 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.CITAT

我正在做两道作业,几个小时后,我几乎把它们都解决了,最后一个问题是,我的两个查询返回的数值都是双倍的,而不是一个

以下是我所拥有的:

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;
我确信我忽略了一些东西。如果有人能告诉我哪里出了差错,那将是一个很大的帮助

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
首先,应该使用联接语法,而不是使用逗号分隔的表列表。它使它更容易阅读,更标准化,并将有助于防止忽视过滤条款的问题

第二,总和过大的最可能原因是由于连接到
违规_引证
表。如果使用聚合函数删除Group By和列,您可能会看到,
P.AMT\u PAID
对于每个
违规\u引证
实例都会重复。或许,以下方法可以解决问题:

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
的使用是为了确保如果左连接没有为给定的
引文ID
值返回任何行,那么我们将
Null
替换为零。

谢谢你,托马斯,这比我现在的位置稍微高级一些,但实际上它工作得非常好。不过,我会研究它,并将它应用到我的其他一些问题上,因为我一直在讨论这些问题,所有这些问题的最终问题都是价值加倍。