USP_DATALIST_MEMBERSHIPCOUNTREPORT
Returns a dataset ordered by Period, Level, Level Type
Parameters
Parameter | Parameter Type | Mode | Description |
---|---|---|---|
@DATE | tinyint | IN | Date |
@DATEFROM | datetime | IN | From |
@DATETO | datetime | IN | To |
@PROGRAMID | uniqueidentifier | IN | |
@BY | tinyint | IN | By |
@GROUPBY | tinyint | IN | Group By |
Definition
Copy
-- NOTE: Logic was pulled from UFN_MEMBERSHIPTRANSACTION_GETMEMBERSHIPCOUNT_BYASOFDATE. Any changes
-- here should be made there as well.
CREATE procedure dbo.USP_DATALIST_MEMBERSHIPCOUNTREPORT
(
@DATE tinyint,
@DATEFROM datetime,
@DATETO datetime,
@PROGRAMID uniqueidentifier,
@BY tinyint,
@GROUPBY tinyint
)
as
set nocount on;
declare @TODAY datetime = getdate();
if object_id('tempdb..#PERIODTABLE') is not null
drop table #PERIODTABLE
create table #PERIODTABLE
(
PERIOD nvarchar(26) collate DATABASE_DEFAULT,
PERIODSTARTDATE datetime,
PERIODENDDATE datetime
);
--create a data table with all possible period's for a given range (@DATEFROM - @DATETO)
with datetable as(
select DateValue = @DATEFROM
union all
select DateValue + 1
from datetable
where DateValue + 1 < @DATETO
)
INSERT INTO #PERIODTABLE(PERIOD, PERIODSTARTDATE, PERIODENDDATE)
--these case statements determine how the date range table will be grouped; by month, quarter, or year
select distinct
case @BY
when 0 then convert(nvarchar(2),datepart(month,DateValue)) + ' / ' + convert(nvarchar(4),datepart(year,DateValue))
when 1 then 'Q' + convert(nvarchar(2),datepart(quarter,DateValue))+ ' - '+convert(nvarchar(4),datepart(year,DateValue))
when 2 then convert(nvarchar(4),datepart(year,DateValue))
end as PERIOD,
case @BY
when 0 then dbo.UFN_DATE_THISMONTH_FIRSTDAY(DateValue,0)
when 1 then dbo.UFN_DATE_THISQUARTER_FIRSTDAY(DateValue,0)
when 2 then dbo.UFN_DATE_THISCALENDARYEAR_FIRSTDAY(DateValue,0)
end as PERIODSTARTDATE,
case @BY
when 0 then dbo.UFN_DATE_THISMONTH_LASTDAY(DateValue,0)
when 1 then dbo.UFN_DATE_THISQUARTER_LASTDAY(DateValue,0)
when 2 then dbo.UFN_DATE_THISCALENDARYEAR_LASTDAY(DateValue,0)
end as PERIODENDDATE
from datetable
OPTION (MAXRECURSION 0);
--check to make sure nothing outside the given date range is used
update #PERIODTABLE
set PERIODSTARTDATE = @DATEFROM
where PERIODSTARTDATE < @DATEFROM;
update #PERIODTABLE
set PERIODENDDATE = @DATETO
where PERIODENDDATE > @DATETO;
-- Push transactions into a temp table so UFN_MEMBERSHIPTRANSACTION_GETMEMBERSHIPCOUNT_BYASOFDATE doesn't have to be used
if object_id('tempdb..#MEMBERSHIPBYDATE') is not null
drop table #MEMBERSHIPBYDATE
create table #MEMBERSHIPBYDATE
(
MEMBERSHIPTRANSACTIONID uniqueidentifier,
TRANSACTIONDATE datetime,
EXPIRATIONDATE datetime,
MEMBERSHIPLEVELTERMID uniqueidentifier,
MEMBERSHIPLEVELID uniqueidentifier,
MEMBERSHIPLEVELTYPECODEID uniqueidentifier,
MEMBERSHIPID uniqueidentifier,
PERIODENDDATE datetime
)
insert into #MEMBERSHIPBYDATE
(
MEMBERSHIPTRANSACTIONID,
TRANSACTIONDATE,
EXPIRATIONDATE,
MEMBERSHIPLEVELTERMID,
MEMBERSHIPLEVELID,
MEMBERSHIPLEVELTYPECODEID,
MEMBERSHIPID,
PERIODENDDATE
)
select
MT.ID,
MT.TRANSACTIONDATE,
MT.EXPIRATIONDATE,
MT.MEMBERSHIPLEVELTERMID,
MT.MEMBERSHIPLEVELID,
MT.MEMBERSHIPLEVELTYPECODEID,
MT.MEMBERSHIPID,
PERIODTABLE.PERIODENDDATE
from #PERIODTABLE as PERIODTABLE
cross apply
(
select
MT.ID,
MT.TRANSACTIONDATE,
MT.EXPIRATIONDATE,
MT.MEMBERSHIPLEVELTERMID,
MT.MEMBERSHIPLEVELID,
MT.MEMBERSHIPLEVELTYPECODEID,
MT.MEMBERSHIPID
from dbo.UFN_MEMBERSHIP_LATESTTRANSACTIONASOF_BULK(PERIODTABLE.PERIODENDDATE) MT
inner join dbo.UFN_MEMBERSHIP_WITHRENEWALWINDOW_GETNOLONGERACTIVEDATES() ACTIVEWINDOWENDDATES on MT.ID = ACTIVEWINDOWENDDATES.MEMBERSHIPTRANSACTIONID
inner join dbo.MEMBERSHIPLEVELTERM MLT on MLT.ID = MT.MEMBERSHIPLEVELTERMID
inner join dbo.MEMBERSHIP M on M.ID = MT.MEMBERSHIPID
inner join dbo.MEMBERSHIPPROGRAM MP on MP.ID = M.MEMBERSHIPPROGRAMID
where MP.ID = @PROGRAMID
and (
ACTIVEWINDOWENDDATES.NOLONGERACTIVEDATE >= PERIODTABLE.PERIODENDDATE
or MLT.TERMCODE = 6
or MP.PROGRAMTYPECODE in (1, 2) --Recurring/Sustaining and Lifetime
)
and MT.ACTIONCODE <> 4
) as MT;
with MEMBERSHIPLEVELBYPERIOD_CTE as
(
select
PERIODTABLE.PERIOD,
PERIODTABLE.PERIODENDDATE,
MEMBERSHIPLEVEL.ID as MEMBERSHIPLEVELID,
MEMBERSHIPLEVEL.NAME as MEMBERSHIPLEVELNAME
from dbo.MEMBERSHIPLEVEL
cross join #PERIODTABLE as PERIODTABLE
where
MEMBERSHIPLEVEL.MEMBERSHIPPROGRAMID = @PROGRAMID
)
select [PERIOD], [COUNT], [GROUPEDBYCOLUMN], [PERIODENDDATE]
from
(
select
MEMBERSHIPLEVELBYPERIOD_CTE.PERIOD,
(
select
count(*)
from #MEMBERSHIPBYDATE MEMBERSHIPBYDATE
where
MEMBERSHIPBYDATE.PERIODENDDATE = MEMBERSHIPLEVELBYPERIOD_CTE.PERIODENDDATE and
MEMBERSHIPBYDATE.MEMBERSHIPLEVELID = MEMBERSHIPLEVELBYPERIOD_CTE.MEMBERSHIPLEVELID
) as [COUNT],
MEMBERSHIPLEVELBYPERIOD_CTE.MEMBERSHIPLEVELNAME as GROUPEDBYCOLUMN,
MEMBERSHIPLEVELBYPERIOD_CTE.PERIODENDDATE
from MEMBERSHIPLEVELBYPERIOD_CTE
where
@GROUPBY = 1
group by
MEMBERSHIPLEVELBYPERIOD_CTE.PERIODENDDATE,
MEMBERSHIPLEVELBYPERIOD_CTE.MEMBERSHIPLEVELID,
MEMBERSHIPLEVELBYPERIOD_CTE.MEMBERSHIPLEVELNAME,
MEMBERSHIPLEVELBYPERIOD_CTE.PERIOD
union all
select
MEMBERSHIPLEVELBYPERIOD_CTE.PERIOD,
(
select
count(*)
from #MEMBERSHIPBYDATE MEMBERSHIPBYDATE
where MEMBERSHIPBYDATE.PERIODENDDATE = MEMBERSHIPLEVELBYPERIOD_CTE.PERIODENDDATE
and (MEMBERSHIPBYDATE.MEMBERSHIPLEVELTYPECODEID = MEMBERSHIPLEVELTYPECODE.ID
or (MEMBERSHIPBYDATE.MEMBERSHIPLEVELTYPECODEID is null and MEMBERSHIPLEVELTYPECODE.ID is null)
)
) as [COUNT],
coalesce(MEMBERSHIPLEVELTYPECODE.DESCRIPTION, 'No Type') as GROUPEDBYCOLUMN,
MEMBERSHIPLEVELBYPERIOD_CTE.PERIODENDDATE
from MEMBERSHIPLEVELBYPERIOD_CTE
left join dbo.MEMBERSHIPLEVELTYPE on MEMBERSHIPLEVELBYPERIOD_CTE.MEMBERSHIPLEVELID = MEMBERSHIPLEVELTYPE.LEVELID
left join dbo.MEMBERSHIPLEVELTYPECODE on MEMBERSHIPLEVELTYPE.LEVELTYPECODEID = MEMBERSHIPLEVELTYPECODE.ID
where
@GROUPBY = 0
group by
MEMBERSHIPLEVELBYPERIOD_CTE.PERIODENDDATE,
MEMBERSHIPLEVELTYPECODE.ID,
MEMBERSHIPLEVELTYPECODE.DESCRIPTION,
MEMBERSHIPLEVELBYPERIOD_CTE.PERIOD
) as a
where a.COUNT > 0
order by
A.PERIODENDDATE,
a.GROUPEDBYCOLUMN;