2014-12-03 141 views
0

我想根据基于datetime的where子句对数据集进行分组,但我需要为Account表中不符合where date要求的任何用户返回计数0。这是我的SQL语句:Group By with Where

select a.userid, count(c.codeentryid) 
from [account] a 
left join codesentered c 
on a.userid = c.userid 
where a.camp = 0 and c.entrydate > '2013-12-03 00:00:00' 
group by a.userid 
order by a.userid 

目前我得到的所有计数谁满足entrydate需求的用户,但我怎么也将返回谁不符合为0的计数这一要求的用户?

回答

1

如果您使用的是left join,在表中的所有条件应进入该on条款。否则,该外连接成为一个内连接。所以,试试这个:

select a.userid, count(c.codeentryid) 
from [account] a left join 
    codesentered c 
    on a.userid = c.userid and c.entrydate > '2013-12-03 00:00:00' 
where a.camp = 0 
group by a.userid 
order by a.userid; 

条件在第一个表中,on子句中基本上忽略。一个left join回报从第一个表中的所有行,即使on子句评估为假或NULL

2

可以包括在join的条件。既然是left outer join,它总是会显示所有记录从account,只有那些codesentered符合条件,其中:

select a.userid, count(c.codeentryid) 
from [account] a 
left outer join codesentered c 
on a.userid = c.userid 
/* here */ and c.entrydate > '2013-12-03 00:00:00' 
where a.camp = 0 
group by a.userid 
order by a.userid 
0

事情是这样的,也许。这将是更容易一些样本数据来检验。

select a.userid, SUM(CASE WHEN c.entrydate > '2013-12-03 00:00:00' THEN 1 ELSE 0 END) 
from [account] a 
left join codesentered c 
on a.userid = c.userid 
where a.camp = 0 
group by a.userid 
order by a.userid