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