查询 return sales 排除结果为 0

Query to return sales excludes results that are 0

我搜索了这个并发现了这个问题,适用于大多数人的解决方案(使用外部联接)对我不起作用。我最初有一个内部连接,并将其切换为外部连接,但我得到了相同的结果。这是基于某些帐号,它显示了他们的总销售额。如果一个帐户的销售额为 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

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

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

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

编辑.. 盲人明白了。 RIGHT OUTER JOIN 是您需要按照编写方式使用的内容,但是对于 2 和 4 的销售 table 列中的所有值,您都有一个空值,因此帐号不能在 ( 1,2,3,4) 或日期之间,这样他们就不会进入结果。

你应该有两个选择。

  1. 首先从 Accounts table 将查询修改为 select,然后加入 Sales table。

    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)
    

我觉得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,也可以,但在不存在的 (NULL) 值上使用 WHERE 条件,因为所有来自外部联接 table 的不匹配值都是NULL 无论如何,应用任何条件,实际上使这些连接成为内部连接(除非它们是 IS NULL 条件),请参阅:http://www.codeproject.com/Articles/33052/Visual-Representation-of-SQL-Joins