2017-08-25 33 views
0

我有一个代码,将所有的代表新客户和他们的年份销售。唯一的问题是,它只会吸引在invdate范围内销售的客户,但如果他们没有任何销售额,我需要它显示所有的账户为0。有什么办法可以做到这一点?我尝试使用COALESCE,它似乎没有工作。我也尝试使用左,右,全外连接。任何帮助,将不胜感激!如何显示客户,即使他们没有销售(结果)

select 
a.Acctnum, 
sum(a.invtotal) as total 
from invoices a right join accounts b on a.acctnum = b.acctnum where 
a.invdate between '1/1/2017' and '12/31/2017' 
and a.sls = '78' 
and b.sls = '78' 
and b.activetype = 'y' and b.startdate > (getdate()-365) 
group by a.acctnum 
order by total desc 

回答

0

你的问题是你在哪里子句正在改变正确的连接到内部连接。把所有被别名混淆了的。进入ON子句。

+0

嗯,这似乎是有道理的。但是,把它们放入ON子句中究竟意味着什么? – Vexxums

+0

查看@ JNevill的回答。 – HLGEM

2

您正在将结果限制在您的WHERE子句中AFTER您加入您的表会导致记录丢失。相反,使用驱动查询的accounts表切换到LEFT OUTER JOIN。然后在子句中限制您的invoices表,以便invoices被删除之前您加入

SELECT a.Acctnum, 
    sum(a.invtotal) AS total 
FROM accounts b 
    LEFT OUTER JOIN invoices a ON 
     a.accntnum = b.acctnum AND 
     --Put the restrictions on your left most table here 
     --so they are removed BEFORE joining. 
     a.invdate BETWEEN '1/1/2017' AND '12/31/2017' 
     AND a.sls = '78' 
WHERE 
    b.sls = '78' 
    AND b.activetype = 'y' 
    AND b.startdate > (getdate() - 365) 
GROUP BY a.acctnum 
ORDER BY total DESC 

这是一个有点像为左表加盟之前invoices做一个子查询。将条件放入ON条款更容易。

相关问题