【问题标题】:Query to return sales excludes results that are 0返回销售额的查询不包括 0 的结果
【发布时间】:2016-05-06 10:57:36
【问题描述】:

我已经搜索过这个问题并发现了这个问题,而适用于大多数人的解决方案(使用外连接)对我不起作用。我最初有一个内部联接,并将其切换到外部联接,但我得到了相同的结果。这是基于某些帐号的,它显示了它们的总销售额。如果一个帐户的销售额为 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 连接会发生什么?
  • 我试过了,结果是一样的:(
  • 好的,所以请参阅下面的答案 - 主要问题是您在 in 子句以及您的选择中使用了 sales.accountnumber。从另一张桌子上拿走

标签: mysql sql ssms


【解决方案1】:

我认为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 条件,因为外部连接表中所有不匹配的值都是 NULL,任何条件都适用,实际上使这些连接成为内部连接(除非它们是 IS NULL 条件),请参阅:http://www.codeproject.com/Articles/33052/Visual-Representation-of-SQL-Joins

【讨论】:

  • 好电话。条件应该在 JOIN 中,而不是在 WHERE 中。
  • 测试最新的编辑,因为有一些错误(错误的表别名)
  • 这种工作。除了它带回了表中的每个帐户号,而不仅仅是我在查询中列出的 4 个帐户号。为什么会这样?
  • 将帐号检查移回常规 WHERE 子句。
  • 糟糕,我没有意识到第二个是 WHERE。但我只是将其更改为 WHERE,现在又恢复到原始结果。 (不显示没有销售的帐户)
【解决方案2】:

你应该有两个选择。

  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)
    

【讨论】:

  • BlindAndFurious 指出您的 WHERE 子句中有适用于整个数据集的条件,因此不会选择没有销售额的帐户。将您的条件添加到 JOIN,如他们的答案所示。
【解决方案3】:

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

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

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

【讨论】:

  • 我已经尝试过了,不幸的是我得到了相同的结果。除了它们的顺序略有不同。
猜你喜欢
  • 2020-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多