我有一个表连接,我希望包括在特定日期之后有记录的所有用户,但只包括在计数中另一个日期之后的记录。
这是我的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
答案 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()
。