从一个表中选择所有记录,并从第二个表中求和

时间:2019-11-26 23:07:38

标签: mysql sql left-join

我不知道我的MySQL语句出了什么问题。我有一张表估算表和一张发票。每个估算可以有多个发票(例如,存入估算,然后剩余余额)。我正在尝试从“估计”中选择所有“估计”,然后将“总和”汇总到每个相应的“估计”中。当我运行此查询时,最终结果中将不包含没有相应发票的估算值。我虽然选择了LEFT JOIN,但是似乎没有选择没有相应发票的估算值。任何帮助将不胜感激!

SELECT p.EstimateID, p.ClientName, p.EstimateTitle, p.EstimateTotalWithTax, SUM(c.InvoiceTotalWithTax)
FROM Estimates p LEFT JOIN
Invoices c ON p.EstimateID = c.EstimateID
WHERE p.EstStatusDateAndTime BETWEEN '2019-1-1  00:00:00' AND '2019-12-31 23:59:59'
AND (p.EstStatus = 3)
AND p.EstimateActive = 'Active' 
AND (p.Template !='Yes' OR p.Template IS NULL)

AND c.InvoiceDate BETWEEN '2019-1-1  00:00:00' AND '2019-12-31 23:59:59'
AND (c.InvoiceStatus = '1' OR c.InvoiceStatus = '2')
 AND (c.InvoiceActive != 0 OR c.InvoiceActive IS NULL)

GROUP BY p.EstimateID

1 个答案:

答案 0 :(得分:1)

您需要将与left join表(发票表)相关的所有条件移至on的{​​{1}}子句中。否则,当估算没有发票时,left join子句中发票列上的条件将无法满足,并且相应的估算将从结果集中逐出(基本上,where变成{{1 }}。

left join

对查询的其他更改:

  • inner join可以简化为SELECT p.EstimateID, p.ClientName, p.EstimateTitle, p.EstimateTotalWithTax, SUM(c.InvoiceTotalWithTax) FROM Estimates p LEFT JOIN Invoices c ON p.EstimateID = c.EstimateID AND c.InvoiceDate >= '2019-01-01' AND c.InvoiceDate < '2020-01-01' AND c.InvoiceStatus IN (1, 2) AND (c.InvoiceActive != 0 OR c.InvoiceActive IS NULL) WHERE p.EstStatusDateAndTime >= '2019-01-01' AND p.EstStatusDateAndTime < '2020-01-01' AND p.EstStatus = 3 AND p.EstimateActive = 'Active' AND (p.Template !='Yes' OR p.Template IS NULL) GROUP BY p.EstimateID 条件(我也假设此列是数字,所以不应该用数字引起来)

  • 我发现(c.InvoiceStatus = '1' OR c.InvoiceStatus = '2')写得更好IN

  • 我还删除了一些多余的括号