我不知道我的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
答案 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
我还删除了一些多余的括号