Users who were active both on December 1 and April 1:
with cte as ( select UserName, FromDate, ToDate from MyTable where Status = 'Active' -- adjust to your status type ) select distinct UserName from cte where FromDate < '20101202' and ToDate >= '20101201' and UserName in ( select * from cte where FromDate < '20110402' and ToDate >= '20110401' )
To find out which users have been added and which users have been deleted, you can do something like this:
with cte as ( select UserName, FromDate, ToDate from MyTable where Status = 'Active' -- adjust to your status type ) select UserName, sum(WasActiveOnDecFirst) WasActiveOnDecFirst, sum(WasActiveOnAprFirst) WasActiveOnAprFirst from ( select isnull(du.UserName, au.UserName) UserName, case when du.UserName is null then 0 else 1 end WasActiveOnDecFirst, case when au.UserName is null then 0 else 1 end WasActiveOnAprFirst from ( select distinct UserName from cte where FromDate < '20101202' and ToDate >= '20101201' ) du full join ( select distinct UserName from cte where FromDate < '20110402' and ToDate >= '20110401' ) au on du.UserName = au.UserName ) tt group by UserName with rollup
The result will look like this:
UserName WasActiveOnDecFirst WasActiveOnAprFirst -------------------- ------------------- ------------------- user1 1 1 user2 1 1 user3 1 1 user4 0 1 NULL 3 4
The last line is the full user number.
source share