Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何显示客户,即使他们没有销售(结果)_Sql - Fatal编程技术网

Sql 如何显示客户,即使他们没有销售(结果)

Sql 如何显示客户,即使他们没有销售(结果),sql,Sql,我有一个代码,可以吸引所有销售代表的新客户和他们今年迄今的销售。唯一的问题是它只会吸引销售在invdate范围内的客户,但如果他们没有任何销售,我需要它显示所有带有0的帐户。有没有办法做到这一点?我试着使用COALESCE,但似乎不起作用。我还尝试使用左、右、全外连接。任何帮助都将不胜感激 select a.Acctnum, sum(a.invtotal) as total from invoices a right join accounts b on a.acctnum = b.ac

我有一个代码,可以吸引所有销售代表的新客户和他们今年迄今的销售。唯一的问题是它只会吸引销售在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

您的问题在于子句正在将右连接更改为内部连接。将所有别名为a的。进入ON子句。

您的问题在于子句将右连接更改为内部连接。将所有别名为a的。进入ON子句。

在加入表后,将结果限制在WHERE子句中,从而导致记录丢失。相反,切换到
左外部联接
,使用
帐户
表驱动查询。然后在
ON
子句中限制
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
子句中更容易

加入表后,您在WHERE子句中限制了结果,导致记录丢失。相反,切换到
左外部联接
,使用
帐户
表驱动查询。然后在
ON
子句中限制
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
子句中更容易

嗯,这似乎有道理。但是你把它们放在ON子句中到底是什么意思呢?看@JNevill的答案。嗯,这似乎有道理。但是你把它们放在ON子句中到底是什么意思呢?参见@JNevill的答案。