Mysql 从一个表中选择所有记录,从第二个表中选择总和

Mysql 从一个表中选择所有记录,从第二个表中选择总和,mysql,sql,left-join,Mysql,Sql,Left Join,我无法找出MySQL语句的问题所在。我有一张估价表和一张发票表。每个估价可以有多张发票(例如,估价的押金和剩余余额)。我试图从估算中选择所有估算,并将发票总额与每个相应估算相加。当我运行此查询时,最终结果中不包括没有相应发票的估计数。我认为左连接将选择所有这些,但似乎没有选择没有相应发票的估算。任何帮助都将不胜感激 SELECT p.EstimateID, p.ClientName, p.EstimateTitle, p.EstimateTotalWithTax, SUM(c.InvoiceTo

我无法找出MySQL语句的问题所在。我有一张估价表和一张发票表。每个估价可以有多张发票(例如,估价的押金和剩余余额)。我试图从估算中选择所有估算,并将发票总额与每个相应估算相加。当我运行此查询时,最终结果中不包括没有相应发票的估计数。我认为左连接将选择所有这些,但似乎没有选择没有相应发票的估算。任何帮助都将不胜感激

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

您需要将所有与
left join
ed表(发票表)相关的条件移动到
left join
on
子句中。否则,当估算没有发票时,
where
子句中发票列上的条件将无法满足,相应的估算将从结果集中逐出(基本上,
左联接
将成为
内部联接

选择
p、 估计的,
p、 客户名称,
p、 估计头衔,
p、 估计含税总额,
总额(c.发票总额含税)
根据估计值p
左连接c
在p.EstimateID=c.EstimateID上
c.发票日期>='2019-01-01'
和c.发票日期<'2020-01-01'
和c.发票状态在(1,2)中
和(c.InvoiceActive!=0或c.InvoiceActive为空)
哪里
p、 EstStatusDateAndTime>='2019-01-01'
和p.EstStatusDateAndTime<'2020-01-01'
p.EstStatus=3
p.EstimateActive='Active'
和(p.Template!=“是”或p.Template为空)
按p.EstimateID分组
对查询的其他更改:

  • (c.InvoiceStatus='1'或c.InvoiceStatus='2')
    可以简化为条件下的
    (我还假设此列是数字列,因此不应引用数字)

  • 我发现,
    c.InvoiceDate在'2019-1-100:00:00'和'2019-12-31 23:59:59'之间写得更好。
    c.InvoiceDate>='2019-01-01'和c.InvoiceDate

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

通过使用
WHERE
子句中左表的字段,可以有效地将
左连接转换为
内部连接。您需要记住,在SQL中,NULL不等于任何值,包括另一个
NULL
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