基于数据子集的计数
我有一个连接到一个表,我想包括所有在特定日期后有记录的用户,但只包括计数中另一个日期之后的记录。基于数据子集的计数
这里是我的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日之后进入我该怎么做?
编辑:所以这会给我在01/01/2011后输入代码的所有用户,但只包括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
从ON
条款删除日期条件和SELECT
子句中使用,而不是COUNT(ce.codeentryid)
:
SUM(CASE WHEN ce.entrydate > '2011-01-01 00:00:00' THEN 1 ELSE 0 END)
COUNT(CASE WHEN ce.entrydate>'2011-01-01 00:00:00'THEN 1 ELSE NULL END) – Vasily 2014-12-04 13:01:11
你的问题是没有意义的,因为使用两个日期是多余的。除非我假设你想要的用户的首次计数在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()
。
请分享样品数据和要求的输出。我无法理解你的要求。 – AK47 2014-12-04 11:43:02