返回销售的查询不包括0的结果

时间:2016-01-28 21:11:49

标签: mysql sql ssms

我搜索了这个并找到了这个问题,并且适用于大多数人的解决方案(使用外连接)对我不起作用。我最初有一个内连接,并将其切换到外连接,但我得到相同的结果。这是基于某些帐号,它显示了他们的总销售额。如果一个帐户有0个销售,它就不会显示,我需要它出现。这是我的询问。

Select a.accountnumber, SUM(a.totalsales) as Amount, c.companyname
FROM Sales a LEFT OUTER JOIN Accounts c on (a.Accountnumber =     c.Accountnumber)
WHERE a.Salesdate between '1/1/2016' and '1/27/2016'
AND a.Accountnumber in ('1','2','3','4')
GROUP BY a.Accountnumber, c.companyname

我会得到如下结果:

Accountnumber | Amount  | Company
       1      | 250.00  |  A
       3      | 500.00  |  B

由于帐号2和4没有金额,因此它们没有出现。我希望他们出现像

Accountnumber | Amount  | Company
       1      | 250.00  |  A
       2      |    0    |  B
       3      | 250.00  |  C
       4      |    0    |  D

我怎样才能做到这一点?任何帮助,将不胜感激。谢谢!

3 个答案:

答案 0 :(得分:5)

我认为RIGHT JOIN不起作用,因为WHERE中存在条件。 试试这个:

SELECT
  c.accountnumber,
  COALESCE(SUM(a.totalsales),0) AS Amount,
  c.companyname
FROM Accounts c
  LEFT OUTER JOIN Sales a
    ON a.Accountnumber = c.Accountnumber
       AND a.Salesdate BETWEEN '1/1/2016' AND '1/27/2016'
WHERE
     c.Accountnumber IN ('1', '2', '3', '4')

GROUP BY c.Accountnumber, c.companyname

只是为了澄清,问题不是使用哪个JOIN,它可以是,但是使用WHERE条件ON不存在(NULL)值,因为来自外连接表的所有不匹配的值都是NULL,无论如何,应用了任何条件,实际上使这些连接成为内部连接(除非它们是IS NULL条件),请参阅:http://www.codeproject.com/Articles/33052/Visual-Representation-of-SQL-Joins

答案 1 :(得分:0)

你应该有两个选择。

  1. 修改查询,先从Accounts表中选择,然后再加入Sales表。

    FROM Accounts c 
    LEFT OUTER JOIN Sales a on (a.Accountnumber = c.Accountnumber)
    
  2. 使用右连接而不是左连接。

    FROM Sales a
    RIGHT OUTER JOIN Accounts c on (a.Accountnumber = c.Accountnumber)
    

答案 2 :(得分:-1)

将其更改为RIGHT OUTER JOIN,它应该可以正常工作。

左连接表示保留左表中的所有内容,IE表示左连接前的表,即使它不存在于第二个表中。在您的情况下,我当然希望没有任何销售没有帐户。要保留所有帐户,即使他们没有销售,您也需要一个正确的外部联接。或者,您可以更改表格的顺序并执行FROM Accounts c LEFT OUTER JOIN Sales a ...

编辑.. 盲人得到了它。 RIGHT OUTER JOIN是您根据编写方式需要使用的,但是对于2和4的sales表中的列中的所有值都为null,因此帐号不能在(1, 2,3,4)或日期之间,所以他们没有把它变成结果。