2014-12-03 177 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