USP_KPI_MEMBERSHIP_RETENTIONRATE

Parameters

Parameter Parameter Type Mode Description
@VALUE decimal(19, 2) INOUT
@ASOFDATE datetime IN
@PROGRAMID uniqueidentifier IN
@STARTDATE nvarchar(50) IN
@SPECIFICDATEVALUE datetime IN
@INCLUDE tinyint IN
@TIERCODEID uniqueidentifier IN
@LEVELID uniqueidentifier IN

Definition

Copy


CREATE procedure dbo.USP_KPI_MEMBERSHIP_RETENTIONRATE(
    @VALUE decimal(19,2) output,
    @ASOFDATE datetime
    @PROGRAMID uniqueidentifier,
    @STARTDATE nvarchar(50),
    @SPECIFICDATEVALUE datetime,
    @INCLUDE tinyint,
    @TIERCODEID uniqueidentifier,
    @LEVELID uniqueidentifier
)
as
    set nocount on;
    declare @RENEW tinyint
            @UPGRADE tinyint
            @DOWNGRADE tinyint,
            @TOTALEXPIRATIONS decimal(19,2),
            @NUMBEROFEXPIRATIONSWITHOUTRENEWALS int,
            @NUMBEROFRENEWED int,
            @REJOIN tinyint

    --set the action code parameters

    if @INCLUDE = 0
    begin
        set @RENEW = 1;
        set @UPGRADE = 2;
        set @DOWNGRADE = 3;
        set @REJOIN = 5;
    end

    else if @INCLUDE = 1
    begin
        set @RENEW = 1;
        set @REJOIN = 5;
    end

    else if @INCLUDE = 2
    begin
        set @UPGRADE = 2;
    end

    else if @INCLUDE = 3
    begin
        set @DOWNGRADE = 3;
    end        

    select @SPECIFICDATEVALUE = case @STARTDATE
        when 0 then dbo.UFN_DATE_GETEARLIESTTIME(@SPECIFICDATEVALUE)           --'Specific Date'

        when 1 then dbo.UFN_DATE_THISMONTH_FIRSTDAY(@ASOFDATE,0)               --'This Month'

        when 2 then dbo.UFN_DATE_THISQUARTER_FIRSTDAY(@ASOFDATE,0)             --'This Quarter' 

        when 3 then dbo.UFN_DATE_THISCALENDARYEAR_FIRSTDAY(@ASOFDATE,0)        --'This Calendar Year' 

        when 4 then dbo.UFN_DATE_THISFISCALYEAR_FIRSTDAY(@ASOFDATE,0)          --'This Fiscal Year'

        when 5 then dbo.UFN_DATE_GETEARLIESTTIME(DATEADD(month, -1, @ASOFDATE))--'One Month Ago' 

        when 6 then dbo.UFN_DATE_GETEARLIESTTIME(DATEADD(month, -3, @ASOFDATE))--'Three Months Ago'

        when 7 then dbo.UFN_DATE_GETEARLIESTTIME(DATEADD(year, -1, @ASOFDATE)) --'Twelve Months Ago' 

    end;    

    set @ASOFDATE = dbo.UFN_DATE_GETLATESTTIME(@ASOFDATE);

    set @VALUE = 0;

    set @NUMBEROFEXPIRATIONSWITHOUTRENEWALS =(
                        select
                            count(MT1.ID)
                        from
                            dbo.MEMBERSHIPTRANSACTION MT1                            
                            inner join dbo.MEMBERSHIPLEVEL on MT1.MEMBERSHIPLEVELID = MEMBERSHIPLEVEL.ID
                            inner join dbo.MEMBERSHIP on MEMBERSHIP.ID = MT1.MEMBERSHIPID
                        where
                                MEMBERSHIPLEVEL.MEMBERSHIPPROGRAMID = @PROGRAMID
                                and
                                (MT1.MEMBERSHIPLEVELID = @LEVELID or @LEVELID is null)
                                and
                                (MEMBERSHIPLEVEL.TIERCODEID = @TIERCODEID or @TIERCODEID is null)
                                and
                                MT1.EXPIRATIONDATE between @SPECIFICDATEVALUE and @ASOFDATE
                                and
                                MT1.ACTIONCODE <> 4
                                and 
                                MEMBERSHIP.STATUSCODE <> 2
                                and
                                not exists(
                                    select 
                                        1 
                                    from 
                                        dbo.MEMBERSHIPTRANSACTION MT2
                                    where MT2.MEMBERSHIPID = MT1.MEMBERSHIPID
                                    and MT2.TRANSACTIONDATE between MT1.TRANSACTIONDATE and @ASOFDATE
                                    and MT2.DATEADDED > MT1.DATEADDED))

    set @NUMBEROFEXPIRATIONSWITHOUTRENEWALS = @NUMBEROFEXPIRATIONSWITHOUTRENEWALS +
                        (select count(MEMBERSHIPTRANSACTION.MEMBERSHIPID)
                                from dbo.MEMBERSHIPTRANSACTION
                                inner join dbo.MEMBERSHIP on MEMBERSHIP.ID = MEMBERSHIPTRANSACTION.MEMBERSHIPID
                                inner join dbo.MEMBERSHIPLEVEL on MEMBERSHIPLEVEL.ID = MEMBERSHIPTRANSACTION.MEMBERSHIPLEVELID
                                where MEMBERSHIPTRANSACTION.ACTIONCODE = 4 --Cancelled

                                and (MEMBERSHIPTRANSACTION.MEMBERSHIPLEVELID = @LEVELID or @LEVELID is null)
                                and MEMBERSHIPTRANSACTION.TRANSACTIONDATE between @SPECIFICDATEVALUE and @ASOFDATE
                                and MEMBERSHIPLEVEL.MEMBERSHIPPROGRAMID = @PROGRAMID
                                and MEMBERSHIP.STATUSCODE <> 2)

    set @NUMBEROFRENEWED = (
                        select
                            count(MT1.ID)
                       from
                            dbo.MEMBERSHIPTRANSACTION MT1
                            inner join dbo.MEMBERSHIPLEVEL on MT1.MEMBERSHIPLEVELID = MEMBERSHIPLEVEL.ID
                            inner join dbo.MEMBERSHIP on MEMBERSHIP.ID = MT1.MEMBERSHIPID
                            where
                                    MEMBERSHIPLEVEL.MEMBERSHIPPROGRAMID = @PROGRAMID
                                    and
                                    (MT1.MEMBERSHIPLEVELID = @LEVELID or @LEVELID is null)
                                    and
                                    (MEMBERSHIPLEVEL.TIERCODEID = @TIERCODEID or @TIERCODEID is null)
                                    and
                                    MT1.ACTIONCODE in (@RENEW, @UPGRADE, @DOWNGRADE, @REJOIN)--variables are null unless initialized above

                                    and 
                                    (MT1.TRANSACTIONDATE >= @SPECIFICDATEVALUE 
                                    and
                                    MT1.TRANSACTIONDATE <= @ASOFDATE));

    set @TOTALEXPIRATIONS = (@NUMBEROFEXPIRATIONSWITHOUTRENEWALS + @NUMBEROFRENEWED);

    if @TOTALEXPIRATIONS = 0        
        return 0;
    else
    begin
        set @VALUE = @NUMBEROFRENEWED / @TOTALEXPIRATIONS;        
        return @VALUE;
    end