我搜索了这个并找到了这个问题,并且适用于大多数人的解决方案(使用外连接)对我不起作用。我最初有一个内连接,并将其切换到外连接,但我得到相同的结果。这是基于某些帐号,它显示了他们的总销售额。如果一个帐户有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
我怎样才能做到这一点?任何帮助,将不胜感激。谢谢!
答案 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)
你应该有两个选择。
修改查询,先从Accounts表中选择,然后再加入Sales表。
FROM Accounts c
LEFT OUTER JOIN Sales a on (a.Accountnumber = c.Accountnumber)
使用右连接而不是左连接。
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)或日期之间,所以他们没有把它变成结果。