【问题标题】:Select all records from one table and sum from the second table MySQL [duplicate]从一个表中选择所有记录并从第二个表中求和 MySQL [重复]
【发布时间】:2019-11-26 23:07:38
【问题描述】:

我无法弄清楚我的 MySQL 语句的问题出在哪里。我有一张 Estimates 表和一张 Invoices 表。每个估算可以有多个发票(例如,估算的存款,然后是余额)。我正在尝试从 Estimates 中选择所有 Estimates,并将发票总数与每个相应的 Estimate 相加。当我运行此查询时,最终结果中不包含没有相应发票的 Estimates。我虽然 LEFT JOIN 会选择所有这些,但似乎没有选择没有相应发票的 Estimates。任何帮助将不胜感激!

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

【问题讨论】:

  • 通过在WHERE 子句中使用left 表的字段,您可以有效地将LEFT JOIN 转换为INNER JOIN。您需要记住,在 SQL 中NULL 不等于任何值,包括另一个NULL

标签: mysql sql left-join


【解决方案1】:

您需要将与left joined 表(发票表)相关的所有条件移动到left joinon 子句中。否则,当一个估价没有发票时,where子句中invoice列的条件不能满足,相应估价从结果集中逐出(基本上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 条件(我还假设此列是数字,因此不应引用数字)

  • 我发现c.InvoiceDate BETWEEN '2019-1-1 00:00:00' AND '2019-12-31 23:59:59'写得更好c.InvoiceDate &gt;= '2019-01-01' AND c.InvoiceDate &lt; '2020-01-01'

  • 我还删除了几个多余的括号

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    • 1970-01-01
    • 2013-05-19
    • 1970-01-01
    相关资源
    最近更新 更多