根据数据子集计数

时间:2014-12-04 11:41:20

标签: sql tsql

我有一个表连接,我希望包括在特定日期之后有记录的所有用户,但只包括在计数中另一个日期之后的记录。

这是我的SQL:

select a.userid, count(ce.codeentryid)
from [account] a
inner join [profile] p
on a.userid = p.userid
inner join codesentered ce
on a.userid = ce.userid  and ce.entrydate > '2011-01-01 00:00:00'
where a.camp = 0
group by a.userid
order by a.userid

所以在这里我想查看2011年1月1日之后输入代码的所有用户的列表,但仅包括2013年1月1日之后输入的计数代码。我该怎么做?

编辑:那么这会给我所有在2011年1月1日之后输入代码的用户,但只包括在01/01/2013之后输入的代码?

select a.userid, count(CASE WHEN ce.entrydate > '2013-01-01 00:00:00' THEN 1 ELSE 0 END)
from [account] a
inner join [profile] p
on a.userid = p.userid
inner join codesentered ce
on a.userid = ce.userid  and ce.entrydate > '2011-01-01 00:00:00'
where a.camp = 0
group by a.userid
order by a.userid

2 个答案:

答案 0 :(得分:1)

ON子句中删除日期条件,并在SELECT子句而非COUNT(ce.codeentryid)中使用此条件:

SUM(CASE WHEN ce.entrydate > '2011-01-01 00:00:00' THEN 1 ELSE 0 END)

答案 1 :(得分:0)

你的问题没有意义,因为使用两个日期是多余的。除非我假设您希望第一次计算在2011-01-01之后的用户然后只计算2013-01-01之后发生的事情。

如果这是你想要的,那么使用having子句:

select a.userid, sum(CASE WHEN ce.entrydate > '2013-01-01 00:00:00' THEN 1 ELSE 0 END)
from [account] a inner join
     [profile] p
     on a.userid = p.userid inner join
     codesentered ce
     on a.userid = ce.userid
where a.camp = 0
group by a.userid
having min(ce.entrydate) > '2011-01-01 00:00:00'
order by a.userid;

请注意,count(CASE WHEN ce.entrydate > '2013-01-01 00:00:00' THEN 1 ELSE 0 END)count(*)相同。 count()计算非空值。请改用sum()