USP_DATALIST_MEMBERSHIPSTATISTICSCOMPARISONREPORT

Fetches membership statistics comparison data.

Parameters

Parameter Parameter Type Mode Description
@THISSTARTDATE datetime IN Start Date
@THISENDDATE datetime IN End Date
@LASTSTARTDATE datetime IN Start Date
@LASTENDDATE datetime IN End Date
@GROUPBY tinyint IN Group by
@MEMBERSHIPPROGRAMID uniqueidentifier IN Membership Program
@CURRENCYCODE tinyint IN Currency

Definition

Copy


CREATE procedure dbo.USP_DATALIST_MEMBERSHIPSTATISTICSCOMPARISONREPORT
(
    @THISSTARTDATE datetime,
    @THISENDDATE datetime,
    @LASTSTARTDATE datetime,
    @LASTENDDATE datetime,
    @GROUPBY tinyint,
    @MEMBERSHIPPROGRAMID uniqueidentifier,
    @CURRENCYCODE tinyint
)
as

/*
    WI #116688 (11/01/2010) the definition of "retention" in this stored proc has been wildly different than the definition 
    in the retention KPI. In order to harmonize the 2, retention rate will now be defined as the percentage of previous 
    period members (as of last end date) who are still members as of this end date *and* have renewed at least once since 
    the last end date.  This must always be a real number between 0 and 100, inclusive.  The actual SQL statements are slightly different
    than those in the KPI, though, in order to optimize processing.
    */
/*
11/07/2010 ChrisFal further changes:
- joins to MEMBER table in this sproc and functions it calls are eliminated, bc/ this sproc evaluates memberships not members. It's in the title.
- no longer do LATESTTIME/EARLIEST time on dates passed by caller, since the caller is responsible for doing so
- uses >= START and < END rather than "between START and END" due to the way caller transforms user-entered end date. 
    (Caller sets END to 00:00:00 the day after.)
- performance optimization by joining to inline TVFs rather than calling scalar functions on each row
*/
/*
11/16/2010 ChrisFal further changes:
- per Megan Williams, the breakdown stats (by activity or channel code) should include *all* transactions within the period, regardless of how
    many times a membership might have had a transaction.  For example, if a membership is dropped in January this year, then rejoined in July, this
    year's stats would tally both transactions.  However, the total memberships as of year end would show only one membership.  (This means that columns
    do not necessarily sum in the report.)
- Another perf optimization: removed non-varying data (such as currency decimal digits) from table var @MEMBERSHIPTRANSACTIONSANDAMOUNT, 
    which also simplifies subsequent group by clauses
*/
/*
3/1/2012 KellySu:
- include the membership add-on revenue and the installment plan payment revenue.
- include the membership recurring payment revenue.
*/

set nocount on;

declare @ORGANIZATIONCURRENCYID uniqueidentifier;
set @ORGANIZATIONCURRENCYID = dbo.UFN_CURRENCY_GETORGANIZATIONCURRENCY();

declare @SELECTEDCURRENCYID uniqueidentifier;
if coalesce(@CURRENCYCODE, 1) = 1
begin
    set @SELECTEDCURRENCYID = @ORGANIZATIONCURRENCYID;
end
else
begin
    select
        @SELECTEDCURRENCYID = MEMBERSHIPPROGRAM.BASECURRENCYID
    from
        dbo.MEMBERSHIPPROGRAM
    where
        MEMBERSHIPPROGRAM.ID = @MEMBERSHIPPROGRAMID;
end

declare @DECIMALDIGITS tinyint;
declare @ROUNDINGTYPECODE tinyint;
declare @CURRENCYISO nvarchar(6);
declare @CURRENCYSYMBOL nvarchar(10);
declare @CURRENCYSYMBOLDISPLAYSETTINGCODE tinyint;

select
    @DECIMALDIGITS = CURRENCY.DECIMALDIGITS,
    @ROUNDINGTYPECODE = CURRENCY.ROUNDINGTYPECODE,
    @CURRENCYISO = CURRENCY.ISO4217,
    @CURRENCYSYMBOL = CURRENCY.CURRENCYSYMBOL,
    @CURRENCYSYMBOLDISPLAYSETTINGCODE = CURRENCY.SYMBOLDISPLAYSETTINGCODE
from
    dbo.CURRENCY
where
    CURRENCY.ID = @SELECTEDCURRENCYID;

-- ChrisFal 11/4/2010 - removed calls to date GETEARLIEST and GETLATEST functions bc/they cause an off-by-one error, since the 

-- report already performs this math on the dates (though in a slightly different way).  


declare @MEMBERSHIPTRANSACTIONSANDAMOUNT table
(
    TIER uniqueidentifier,
    TIERSEQUENCE int,
    MEMBERSHIPLEVEL uniqueidentifier,
    MEMBERSHIPLEVELSEQUENCE tinyint,
    MEMBERSHIPTRANSACTIONID uniqueidentifier,
    REVENUEAMOUNT money,
    ACTIONCODE tinyint,
    CHANNELCODEID uniqueidentifier,
    PERIOD bit,
    REFUNDAMOUNT money
);

/* Begin populate @MEMBERSHIPTRANSACTIONSANDAMOUNT */

with MEMBERSHIPDISCOUNT_CTE as
(
    select
        REVENUESPLITID,
        sum(CREDITITEM.TOTAL) as CREDITAMOUNT
    from
        dbo.CREDITITEM
        inner join dbo.CREDIT on CREDITITEM.CREDITID = CREDIT.ID 
    where
        CREDIT.SALESORDERITEMMEMBERSHIPITEMPROMOTIONID is not null
        and REVENUESPLITID is not null 
        and CREDITITEM.TYPECODE = 1
    group by
        REVENUESPLITID
),
MEMBERSHIPREFUND_CTE_2 as 
(
    select
        REVENUESPLITID,
        sum(CREDITITEM.TOTAL) as CREDITAMOUNT
    from
        dbo.CREDITITEM
        inner join dbo.CREDIT on CREDITITEM.CREDITID = CREDIT.ID 
    where
        CREDIT.SALESORDERITEMMEMBERSHIPITEMPROMOTIONID is null 
        and REVENUESPLITID is not null 
        and CREDITITEM.TYPECODE IN (1,16)
    group by
        REVENUESPLITID
)
-- Period: 1 = this period, 0 = last period.

-- All downgrades should exist within the previous level.

-- If a downgrade is found, the level in the transaction previous is stored.

insert into @MEMBERSHIPTRANSACTIONSANDAMOUNT
(
    TIER,
    TIERSEQUENCE,
    MEMBERSHIPLEVEL,
    MEMBERSHIPLEVELSEQUENCE,
    MEMBERSHIPTRANSACTIONID,
    REVENUEAMOUNT,
    ACTIONCODE,
    CHANNELCODEID,
    PERIOD,
    REFUNDAMOUNT
)

-- Getting all transactions within this period.

select
    MEMBERSHIPLEVEL.TIERCODEID,
    TIERCODE.SEQUENCE,
    MEMBERSHIPLEVEL.ID,
    MEMBERSHIPLEVEL.SEQUENCE,
    MEMBERSHIPTRANSACTION.ID as MEMBERSHIPTRANSACTIONID,
    coalesce(RS.AMOUNTINCURRENCY,0) - coalesce(MEMBERSHIPDISCOUNT_CTE.CREDITAMOUNT, 0) - coalesce(MEMBERSHIPREFUND_CTE_2.CREDITAMOUNT, 0) as AMOUNT,
    MEMBERSHIPTRANSACTION.ACTIONCODE,
    RS.CHANNELCODEID,
    1,
    -coalesce(MEMBERSHIPREFUND_CTE_2.CREDITAMOUNT, 0)
from
    dbo.MEMBERSHIPLEVEL
    inner join dbo.MEMBERSHIPTRANSACTION on MEMBERSHIPTRANSACTION.MEMBERSHIPLEVELID = MEMBERSHIPLEVEL.ID
    left join dbo.UFN_REVENUESPLIT_GETAMOUNTINCURRENCY_BULK(@SELECTEDCURRENCYID, @ORGANIZATIONCURRENCYID, @DECIMALDIGITS, @ROUNDINGTYPECODE) as RS
        on MEMBERSHIPTRANSACTION.REVENUESPLITID = RS.ID 
        and RS.APPLICATIONCODE = 5
        and RS.TRANSACTIONTYPECODE in (0,5)
    left outer join MEMBERSHIPREFUND_CTE_2 on RS.ID = MEMBERSHIPREFUND_CTE_2.REVENUESPLITID 
    left outer join MEMBERSHIPDISCOUNT_CTE on RS.ID = MEMBERSHIPDISCOUNT_CTE.REVENUESPLITID 
    left outer join dbo.TIERCODE on MEMBERSHIPLEVEL.TIERCODEID = TIERCODE.ID
where
    (
        (RS.DATE >= @THISSTARTDATE and RS.DATE < @THISENDDATE)
        or
        (
            MEMBERSHIPTRANSACTION.TRANSACTIONDATE >= @THISSTARTDATE
            and MEMBERSHIPTRANSACTION.TRANSACTIONDATE < @THISENDDATE
            and MEMBERSHIPTRANSACTION.ACTIONCODE = 4
        )
    )
    and MEMBERSHIPLEVEL.MEMBERSHIPPROGRAMID = @MEMBERSHIPPROGRAMID

union all

--get the addon revenue this period

select
    MEMBERSHIPLEVEL.TIERCODEID,
    TIERCODE.SEQUENCE,
    MEMBERSHIPLEVEL.ID,
    MEMBERSHIPLEVEL.SEQUENCE,
    ADDON.MEMBERSHIPTRANSACTIONID,
    coalesce(RS.AMOUNTINCURRENCY,0) - coalesce(MEMBERSHIPDISCOUNT_CTE.CREDITAMOUNT, 0) - coalesce(MEMBERSHIPREFUND_CTE_2.CREDITAMOUNT, 0) as AMOUNT,
    ADDON.ACTIONCODE,
    RS.CHANNELCODEID,
    1,
    -coalesce(MEMBERSHIPREFUND_CTE_2.CREDITAMOUNT, 0)
from
    dbo.UFN_REVENUESPLIT_GETAMOUNTINCURRENCY_BULK(@SELECTEDCURRENCYID, @ORGANIZATIONCURRENCYID, @DECIMALDIGITS, @ROUNDINGTYPECODE) as RS
    --Addon revenue pulls in transaction info from the membership directly

    inner join
    (
        select
            MEMBERSHIPADDON.REVENUESPLITID, 
            MEMBERSHIP.MEMBERSHIPLEVELID, 
            MEMBERSHIPTRANSACTION.ID, 
            MEMBERSHIPTRANSACTION.ACTIONCODE, 
            MEMBERSHIPTRANSACTION.ACTION,
            MEMBERSHIPTRANSACTION.TRANSACTIONDATE,
            MEMBERSHIPADDON.MEMBERSHIPTRANSACTIONID
        from
            dbo.MEMBERSHIPADDON
            inner join dbo.MEMBERSHIP on MEMBERSHIPADDON.MEMBERSHIPID = MEMBERSHIP.ID
            inner join dbo.MEMBERSHIPTRANSACTION on MEMBERSHIPADDON.MEMBERSHIPTRANSACTIONID = MEMBERSHIPTRANSACTION.ID
    ) as ADDON
        on ADDON.REVENUESPLITID = RS.ID
        and RS.APPLICATIONCODE = 18
        and RS.TRANSACTIONTYPECODE in (0,5)
    inner join dbo.MEMBERSHIPLEVEL
        on MEMBERSHIPLEVEL.ID = ADDON.MEMBERSHIPLEVELID
        and MEMBERSHIPLEVEL.MEMBERSHIPPROGRAMID = @MEMBERSHIPPROGRAMID
        and RS.DATE >= @THISSTARTDATE 
        and RS.DATE < @THISENDDATE
    left outer join MEMBERSHIPREFUND_CTE_2 on RS.ID = MEMBERSHIPREFUND_CTE_2.REVENUESPLITID 
    left outer join MEMBERSHIPDISCOUNT_CTE on RS.ID = MEMBERSHIPDISCOUNT_CTE.REVENUESPLITID 
    left outer join dbo.TIERCODE on MEMBERSHIPLEVEL.TIERCODEID = TIERCODE.ID

union all

--Get installment payments and installment payment add-ons within this period

select distinct
    MEMBERSHIPLEVEL.TIERCODEID,
    TIERCODE.SEQUENCE,
    MEMBERSHIPLEVEL.ID,
    MEMBERSHIPLEVEL.SEQUENCE,
    MEMBERSHIPTRANSACTION.ID as MEMBERSHIPTRANSACTIONID,
    coalesce(RS.AMOUNTINCURRENCY,0) - coalesce(MEMBERSHIPDISCOUNT_CTE.CREDITAMOUNT, 0) - coalesce(MEMBERSHIPREFUND_CTE_2.CREDITAMOUNT, 0) as AMOUNT,
    MEMBERSHIPTRANSACTION.ACTIONCODE,
    RS.CHANNELCODEID,
    1,
    -coalesce(MEMBERSHIPREFUND_CTE_2.CREDITAMOUNT, 0)
from
    dbo.INSTALLMENTPAYMENT
    inner join dbo.UFN_REVENUESPLIT_GETAMOUNTINCURRENCY_BULK(@SELECTEDCURRENCYID, @ORGANIZATIONCURRENCYID, @DECIMALDIGITS, @ROUNDINGTYPECODE) as RS
        on RS.ID = INSTALLMENTPAYMENT.PAYMENTID
    inner join dbo.REVENUESPLIT_EXT on REVENUESPLIT_EXT.ID = RS.ID
    inner join dbo.REVENUE_EXT as PLEDGE_REVENUE on PLEDGE_REVENUE.ID = INSTALLMENTPAYMENT.PLEDGEID
    inner join dbo.FINANCIALTRANSACTIONLINEITEM as PLEDGE_FTLI on PLEDGE_REVENUE.ID = PLEDGE_FTLI.FINANCIALTRANSACTIONID
    inner join dbo.MEMBERSHIPTRANSACTION on MEMBERSHIPTRANSACTION.REVENUESPLITID = PLEDGE_FTLI.ID
    inner join dbo.MEMBERSHIPLEVEL on MEMBERSHIPTRANSACTION.MEMBERSHIPLEVELID = MEMBERSHIPLEVEL.ID
    left outer join MEMBERSHIPREFUND_CTE_2 on RS.ID = MEMBERSHIPREFUND_CTE_2.REVENUESPLITID 
    left outer join MEMBERSHIPDISCOUNT_CTE on RS.ID = MEMBERSHIPDISCOUNT_CTE.REVENUESPLITID 
    left outer join dbo.TIERCODE on MEMBERSHIPLEVEL.TIERCODEID = TIERCODE.ID
where
    RS.DATE >= @THISSTARTDATE 
    and RS.DATE < @THISENDDATE
    and MEMBERSHIPLEVEL.MEMBERSHIPPROGRAMID = @MEMBERSHIPPROGRAMID
    and RS.TRANSACTIONTYPECODE = 0 and REVENUESPLIT_EXT.TYPECODE IN (2, 18) AND RS.APPLICATIONCODE in (18,19)

union all

--Get recurring payments

select
    MEMBERSHIPLEVEL.TIERCODEID,
    TIERCODE.SEQUENCE,
    MEMBERSHIPLEVEL.ID,
    MEMBERSHIPLEVEL.SEQUENCE,
    MEMBERSHIPTRANSACTION.ID as MEMBERSHIPTRANSACTIONID,
    coalesce(RS.AMOUNTINCURRENCY,0) - coalesce(MEMBERSHIPDISCOUNT_CTE.CREDITAMOUNT, 0) - coalesce(MEMBERSHIPREFUND_CTE_2.CREDITAMOUNT, 0) as AMOUNT,
    MEMBERSHIPTRANSACTION.ACTIONCODE,
    RS.CHANNELCODEID,
    1,
    -coalesce(MEMBERSHIPREFUND_CTE_2.CREDITAMOUNT, 0)
from
    dbo.UFN_REVENUESPLIT_GETAMOUNTINCURRENCY_BULK(@SELECTEDCURRENCYID, @ORGANIZATIONCURRENCYID, @DECIMALDIGITS, @ROUNDINGTYPECODE) as RS
    inner join dbo.RECURRINGGIFTINSTALLMENTPAYMENT on RS.REVENUEID = RECURRINGGIFTINSTALLMENTPAYMENT.PAYMENTID
    inner join dbo.RECURRINGGIFTINSTALLMENT on RECURRINGGIFTINSTALLMENT.ID = RECURRINGGIFTINSTALLMENTPAYMENT.RECURRINGGIFTINSTALLMENTID
    inner join dbo.FINANCIALTRANSACTION as PLEDGE_XACTION on PLEDGE_XACTION.ID = RECURRINGGIFTINSTALLMENT.REVENUEID
    inner join dbo.FINANCIALTRANSACTIONLINEITEM as PLEDGE_FTLI on PLEDGE_FTLI.FINANCIALTRANSACTIONID = PLEDGE_XACTION.ID
    inner join dbo.REVENUESPLIT_EXT on REVENUESPLIT_EXT.ID = RS.ID
    left join dbo.MEMBERSHIPTRANSACTION on MEMBERSHIPTRANSACTION.REVENUESPLITID = PLEDGE_FTLI.ID
    left join dbo.MEMBERSHIPLEVEL on MEMBERSHIPTRANSACTION.MEMBERSHIPLEVELID = MEMBERSHIPLEVEL.ID
    -- for donation refund

    left outer join MEMBERSHIPREFUND_CTE_2 on RS.ID = MEMBERSHIPREFUND_CTE_2.REVENUESPLITID 
    left outer join MEMBERSHIPDISCOUNT_CTE on RS.ID = MEMBERSHIPDISCOUNT_CTE.REVENUESPLITID 
    left outer join dbo.TIERCODE on MEMBERSHIPLEVEL.TIERCODEID = TIERCODE.ID
where
    RS.DATE >= @THISSTARTDATE 
    and RS.DATE < @THISENDDATE
    and RS.TRANSACTIONTYPECODE = 0 and REVENUESPLIT_EXT.TYPECODE IN (2) and RS.APPLICATIONCODE = 3
    and MEMBERSHIPLEVEL.MEMBERSHIPPROGRAMID = @MEMBERSHIPPROGRAMID

union all

-- Getting all transactions within last period

select
    MEMBERSHIPLEVEL.TIERCODEID,
    TIERCODE.SEQUENCE,
    MEMBERSHIPLEVEL.ID,
    MEMBERSHIPLEVEL.SEQUENCE,
    MEMBERSHIPTRANSACTION.ID as MEMBERSHIPTRANSACTIONID,
    coalesce(RS.AMOUNTINCURRENCY,0) - coalesce(MEMBERSHIPDISCOUNT_CTE.CREDITAMOUNT, 0) - coalesce(MEMBERSHIPREFUND_CTE_2.CREDITAMOUNT, 0) as AMOUNT,
    MEMBERSHIPTRANSACTION.ACTIONCODE,
    RS.CHANNELCODEID,
    0,
    -coalesce(MEMBERSHIPREFUND_CTE_2.CREDITAMOUNT, 0)
from
    dbo.MEMBERSHIPLEVEL
    inner join dbo.MEMBERSHIPTRANSACTION on MEMBERSHIPTRANSACTION.MEMBERSHIPLEVELID = MEMBERSHIPLEVEL.ID
    left join dbo.UFN_REVENUESPLIT_GETAMOUNTINCURRENCY_BULK(@SELECTEDCURRENCYID, @ORGANIZATIONCURRENCYID, @DECIMALDIGITS, @ROUNDINGTYPECODE) as RS
        on MEMBERSHIPTRANSACTION.REVENUESPLITID = RS.ID 
        and RS.APPLICATIONCODE in (5,18)
        and RS.TRANSACTIONTYPECODE IN (0,5)
    left outer join MEMBERSHIPREFUND_CTE_2 on RS.ID = MEMBERSHIPREFUND_CTE_2.REVENUESPLITID 
    left outer join MEMBERSHIPDISCOUNT_CTE on RS.ID = MEMBERSHIPDISCOUNT_CTE.REVENUESPLITID 
    left outer join dbo.TIERCODE on MEMBERSHIPLEVEL.TIERCODEID = TIERCODE.ID
where
    RS.DATE >= @LASTSTARTDATE 
    and RS.DATE < @LASTENDDATE
    and MEMBERSHIPLEVEL.MEMBERSHIPPROGRAMID = @MEMBERSHIPPROGRAMID

union all

select
    MEMBERSHIPLEVEL.TIERCODEID,
    TIERCODE.SEQUENCE,
    MEMBERSHIPLEVEL.ID,
    MEMBERSHIPLEVEL.SEQUENCE,
    ADDON.MEMBERSHIPTRANSACTIONID,
    coalesce(RS.AMOUNTINCURRENCY,0) - coalesce(MEMBERSHIPDISCOUNT_CTE.CREDITAMOUNT, 0) - coalesce(MEMBERSHIPREFUND_CTE_2.CREDITAMOUNT, 0) as AMOUNT,
    ADDON.ACTIONCODE,
    RS.CHANNELCODEID,
    0,
    -coalesce(MEMBERSHIPREFUND_CTE_2.CREDITAMOUNT, 0)
from
    dbo.UFN_REVENUESPLIT_GETAMOUNTINCURRENCY_BULK(@SELECTEDCURRENCYID, @ORGANIZATIONCURRENCYID, @DECIMALDIGITS, @ROUNDINGTYPECODE) as RS 
    --Addon revenue pulls in transaction info from the membership directly

    inner join 
    (
        select
            MEMBERSHIPADDON.REVENUESPLITID, 
            MEMBERSHIP.MEMBERSHIPLEVELID, 
            MEMBERSHIPTRANSACTION.ID, 
            MEMBERSHIPTRANSACTION.ACTIONCODE, 
            MEMBERSHIPTRANSACTION.ACTION,
            MEMBERSHIPTRANSACTION.TRANSACTIONDATE,
            MEMBERSHIPADDON.MEMBERSHIPTRANSACTIONID
        from
            dbo.MEMBERSHIPADDON
            inner join dbo.MEMBERSHIP on MEMBERSHIPADDON.MEMBERSHIPID = MEMBERSHIP.ID
            inner join dbo.MEMBERSHIPTRANSACTION on MEMBERSHIPADDON.MEMBERSHIPTRANSACTIONID = MEMBERSHIPTRANSACTION.ID
    ) as ADDON
        on ADDON.REVENUESPLITID = RS.ID
        and RS.APPLICATIONCODE = 18
        and RS.TRANSACTIONTYPECODE IN (0,5)
    inner join dbo.MEMBERSHIPLEVEL
        on MEMBERSHIPLEVEL.ID = ADDON.MEMBERSHIPLEVELID
        and MEMBERSHIPLEVEL.MEMBERSHIPPROGRAMID = @MEMBERSHIPPROGRAMID
        and RS.DATE >= @LASTSTARTDATE 
        and RS.DATE < @LASTENDDATE
    left outer join MEMBERSHIPREFUND_CTE_2 on RS.ID = MEMBERSHIPREFUND_CTE_2.REVENUESPLITID 
    left outer join MEMBERSHIPDISCOUNT_CTE on RS.ID = MEMBERSHIPDISCOUNT_CTE.REVENUESPLITID 
    left outer join dbo.TIERCODE on MEMBERSHIPLEVEL.TIERCODEID = TIERCODE.ID

union all

--Get installment payments and installment payment add-ons within last period

select distinct
    MEMBERSHIPLEVEL.TIERCODEID,
    TIERCODE.SEQUENCE,
    MEMBERSHIPLEVEL.ID,
    MEMBERSHIPLEVEL.SEQUENCE,
    MEMBERSHIPTRANSACTION.ID as MEMBERSHIPTRANSACTIONID,
    coalesce(RS.AMOUNTINCURRENCY,0) - coalesce(MEMBERSHIPDISCOUNT_CTE.CREDITAMOUNT, 0) - coalesce(MEMBERSHIPREFUND_CTE_2.CREDITAMOUNT, 0) as AMOUNT,
    MEMBERSHIPTRANSACTION.ACTIONCODE,
    RS.CHANNELCODEID,
    0,
    -coalesce(MEMBERSHIPREFUND_CTE_2.CREDITAMOUNT, 0)
from
    dbo.INSTALLMENTPAYMENT
    inner join dbo.UFN_REVENUESPLIT_GETAMOUNTINCURRENCY_BULK(@SELECTEDCURRENCYID, @ORGANIZATIONCURRENCYID, @DECIMALDIGITS, @ROUNDINGTYPECODE) as RS
        on RS.ID = INSTALLMENTPAYMENT.PAYMENTID
    inner join dbo.REVENUESPLIT_EXT on REVENUESPLIT_EXT.ID = RS.ID
    inner join dbo.REVENUE_EXT as PLEDGE_REVENUE on PLEDGE_REVENUE.ID = INSTALLMENTPAYMENT.PLEDGEID
    inner join dbo.FINANCIALTRANSACTIONLINEITEM as PLEDGE_FTLI on PLEDGE_REVENUE.ID = PLEDGE_FTLI.FINANCIALTRANSACTIONID
    inner join dbo.MEMBERSHIPTRANSACTION on MEMBERSHIPTRANSACTION.REVENUESPLITID = PLEDGE_FTLI.ID
    inner join dbo.MEMBERSHIPLEVEL ON MEMBERSHIPTRANSACTION.MEMBERSHIPLEVELID = MEMBERSHIPLEVEL.ID
    -- for donation refund

    left outer join MEMBERSHIPREFUND_CTE_2 on RS.ID = MEMBERSHIPREFUND_CTE_2.REVENUESPLITID 
    left outer join MEMBERSHIPDISCOUNT_CTE on RS.ID = MEMBERSHIPDISCOUNT_CTE.REVENUESPLITID 
    left outer join dbo.TIERCODE on MEMBERSHIPLEVEL.TIERCODEID = TIERCODE.ID
where
    RS.DATE >= @LASTSTARTDATE 
    and RS.DATE < @LASTENDDATE
    and MEMBERSHIPLEVEL.MEMBERSHIPPROGRAMID = @MEMBERSHIPPROGRAMID
    and RS.TRANSACTIONTYPECODE = 0 and REVENUESPLIT_EXT.TYPECODE IN (2, 18) AND RS.APPLICATIONCODE in (18,19)

union all

--Get recurring payments

select
    MEMBERSHIPLEVEL.TIERCODEID,
    TIERCODE.SEQUENCE,
    MEMBERSHIPLEVEL.ID,
    MEMBERSHIPLEVEL.SEQUENCE,
    MEMBERSHIPTRANSACTION.ID as MEMBERSHIPTRANSACTIONID,
    coalesce(RS.AMOUNTINCURRENCY,0) - coalesce(MEMBERSHIPDISCOUNT_CTE.CREDITAMOUNT, 0) - coalesce(MEMBERSHIPREFUND_CTE_2.CREDITAMOUNT, 0) as AMOUNT,
    MEMBERSHIPTRANSACTION.ACTIONCODE,
    RS.CHANNELCODEID,
    0,
    -coalesce(MEMBERSHIPREFUND_CTE_2.CREDITAMOUNT, 0)
from
    dbo.UFN_REVENUESPLIT_GETAMOUNTINCURRENCY_BULK(@SELECTEDCURRENCYID, @ORGANIZATIONCURRENCYID, @DECIMALDIGITS, @ROUNDINGTYPECODE) as RS
    inner join RECURRINGGIFTINSTALLMENTPAYMENT on RS.REVENUEID = RECURRINGGIFTINSTALLMENTPAYMENT.PAYMENTID
    inner join dbo.RECURRINGGIFTINSTALLMENT on RECURRINGGIFTINSTALLMENT.ID = RECURRINGGIFTINSTALLMENTPAYMENT.RECURRINGGIFTINSTALLMENTID
    inner join dbo.FINANCIALTRANSACTION as PLEDGE_XACTION on PLEDGE_XACTION.ID = RECURRINGGIFTINSTALLMENT.REVENUEID
    inner join dbo.FINANCIALTRANSACTIONLINEITEM as PLEDGE_FTLI on PLEDGE_FTLI.FINANCIALTRANSACTIONID = PLEDGE_XACTION.ID
    inner join dbo.REVENUESPLIT_EXT on REVENUESPLIT_EXT.ID = RS.ID
    left join dbo.MEMBERSHIPTRANSACTION on MEMBERSHIPTRANSACTION.REVENUESPLITID = PLEDGE_FTLI.ID
    left join dbo.MEMBERSHIPLEVEL on MEMBERSHIPTRANSACTION.MEMBERSHIPLEVELID = MEMBERSHIPLEVEL.ID
    -- for donation refund 

    left outer join MEMBERSHIPREFUND_CTE_2 on RS.ID = MEMBERSHIPREFUND_CTE_2.REVENUESPLITID 
    left outer join MEMBERSHIPDISCOUNT_CTE on RS.ID = MEMBERSHIPDISCOUNT_CTE.REVENUESPLITID 
    left outer join dbo.TIERCODE on MEMBERSHIPLEVEL.TIERCODEID = TIERCODE.ID
where RS.DATE >= @LASTSTARTDATE 
    and RS.DATE < @LASTENDDATE
    and RS.TRANSACTIONTYPECODE = 0 and REVENUESPLIT_EXT.TYPECODE IN (2) and RS.APPLICATIONCODE = 3
    and MEMBERSHIPLEVEL.MEMBERSHIPPROGRAMID = @MEMBERSHIPPROGRAMID;

delete
from @MEMBERSHIPTRANSACTIONSANDAMOUNT
where exists
(
    select 1
    from
        dbo.MEMBERSHIPTRANSACTION
        inner join dbo.MEMBERSHIP on MEMBERSHIP.ID = MEMBERSHIPTRANSACTION.MEMBERSHIPID
    where
        MEMBERSHIPTRANSACTION.ID = [@MEMBERSHIPTRANSACTIONSANDAMOUNT].MEMBERSHIPTRANSACTIONID
        and STATUSCODE = 2
);

/* End populate @MEMBERSHIPTRANSACTIONSANDAMOUNT */

-- Calculate totals

declare @TOTALMEMBERSLASTPERIOD integer;
declare @TOTALMEMBERSTHISPERIOD integer;
declare @TOTALJOINEDMEMBERS integer;
declare @TOTALRENEWEDMEMBERS integer;
declare @TOTALRETENTIONRATE decimal(13,4);

select @TOTALMEMBERSLASTPERIOD = count(MEMBERSHIPID) from dbo.UFN_MEMBERSHIPPROGRAM_MEMBERSHIPSASOF(@MEMBERSHIPPROGRAMID, @LASTENDDATE) where ACTIONCODE <> 4
select @TOTALMEMBERSTHISPERIOD = count(MEMBERSHIPID) from dbo.UFN_MEMBERSHIPPROGRAM_MEMBERSHIPSASOF(@MEMBERSHIPPROGRAMID, @THISENDDATE) where ACTIONCODE <> 4

select
    @TOTALJOINEDMEMBERS = sum(dbo.UFN_MEMBERSHIPTRANSACTION_MEMBERCOUNT_BYLEVELANDTRANSACTION(MEMBERSHIPLEVEL.ID, @THISSTARTDATE, @THISENDDATE, 0)),
    @TOTALRENEWEDMEMBERS = sum(dbo.UFN_MEMBERSHIPTRANSACTION_MEMBERCOUNT_BYLEVELANDTRANSACTION(MEMBERSHIPLEVEL.ID, @THISSTARTDATE, @THISENDDATE, 1))
from
    dbo.MEMBERSHIPLEVEL
where
    MEMBERSHIPLEVEL.ID in (select distinct MEMBERSHIPLEVEL from @MEMBERSHIPTRANSACTIONSANDAMOUNT);

declare @numPreviousMembers int;
declare @numRetainedMembers int;
with PREVIOUSMEMBERS_CTE as 
(
    select 
        MEMBERSHIPID
    from 
        dbo.UFN_MEMBERSHIPPROGRAM_MEMBERSHIPSASOF(@MEMBERSHIPPROGRAMID, @LASTENDDATE
    where 
        EXPIRATIONDATE < @THISENDDATE -- do not include non-expiring previous memberships (or lifetime memberships)

        and ACTIONCODE <> 4 -- do not include those who dropped

),
RETAINEDMEMBERS_CTE as
(
    select 
        MEMBERSHIPID
    from 
        dbo.UFN_MEMBERSHIPPROGRAM_MEMBERSHIPSASOF(@MEMBERSHIPPROGRAMID, @THISENDDATE)
    where 
        ACTIONCODE <> 4 -- do not include those who dropped

)
select 
    @numPreviousMembers = COUNT(PREV.MEMBERSHIPID), 
    @numRetainedMembers = COUNT(RET.MEMBERSHIPID)
from 
    PREVIOUSMEMBERS_CTE PREV
    left join RETAINEDMEMBERS_CTE RET on PREV.MEMBERSHIPID = RET.MEMBERSHIPID;

set @TOTALRETENTIONRATE =    case @numPreviousMembers
                                when 0 then convert(decimal(13,4), 0)
                                else (convert(decimal(13,4), @numRetainedMembers) / convert(decimal(13,4),@numPreviousMembers))
                            end

-- RobertDi 11/24/2010 - Prepopulate table variables with data to help with performance.


declare @RETENTIONRATES table
(
    MEMBERSHIPLEVELID uniqueidentifier,
    RETENTIONRATE decimal(13,4)
);

insert into @RETENTIONRATES (MEMBERSHIPLEVELID, RETENTIONRATE)
select
    MEMBERSHIPLEVELID,
    RETENTIONRATE
from
    dbo.UFN_MEMBERSHIPLEVELS_GETRETENTIONRATE(@MEMBERSHIPPROGRAMID, @LASTENDDATE, @THISENDDATE);

declare @THISPERIODMEMBERSHIPS table
(
    MEMBERSHIPLEVELID uniqueidentifier,
    MEMBERSHIPLEVELSEQUENCE tinyint,
    TIER uniqueidentifier,
    TIERSEQUENCE int,
    MEMBERSHIPCOUNT int
);

declare @LASTPERIODMEMBERSHIPS table
(
    MEMBERSHIPLEVELID uniqueidentifier,
    MEMBERSHIPLEVELSEQUENCE tinyint,
    TIER uniqueidentifier,
    TIERSEQUENCE int,
    MEMBERSHIPCOUNT int
);

insert into @THISPERIODMEMBERSHIPS
(
    MEMBERSHIPLEVELID, 
    MEMBERSHIPLEVELSEQUENCE, 
    TIER,
    TIERSEQUENCE,
    MEMBERSHIPCOUNT
)
select
    MEMBERSHIPLEVELID,
    MEMBERSHIPLEVEL.SEQUENCE,
    MEMBERSHIPLEVEL.TIERCODEID,
    TIERCODE.SEQUENCE,
    COUNT(MEMBERSHIPID) MEMBERSHIPCOUNT
from
    dbo.UFN_MEMBERSHIPPROGRAM_MEMBERSHIPSASOF(@MEMBERSHIPPROGRAMID, @THISENDDATE) MEMBERSHIPS
    inner join dbo.MEMBERSHIPLEVEL on MEMBERSHIPS.MEMBERSHIPLEVELID = MEMBERSHIPLEVEL.ID
    left outer join dbo.TIERCODE on MEMBERSHIPLEVEL.TIERCODEID = TIERCODE.ID
where
    MEMBERSHIPS.ACTIONCODE <> 4
group by
    MEMBERSHIPS.MEMBERSHIPLEVELID,
    MEMBERSHIPLEVEL.SEQUENCE,
    MEMBERSHIPLEVEL.TIERCODEID,
    TIERCODE.SEQUENCE;

insert into @LASTPERIODMEMBERSHIPS
(
    MEMBERSHIPLEVELID, 
    MEMBERSHIPLEVELSEQUENCE, 
    TIER,
    TIERSEQUENCE,
    MEMBERSHIPCOUNT
)
select
    MEMBERSHIPLEVELID,
    MEMBERSHIPLEVEL.SEQUENCE,
    MEMBERSHIPLEVEL.TIERCODEID,
    TIERCODE.SEQUENCE,
    COUNT(MEMBERSHIPID) MEMBERSHIPCOUNT
from
    dbo.UFN_MEMBERSHIPPROGRAM_MEMBERSHIPSASOF(@MEMBERSHIPPROGRAMID, @LASTENDDATE) MEMBERSHIPS
    inner join dbo.MEMBERSHIPLEVEL on MEMBERSHIPS.MEMBERSHIPLEVELID = MEMBERSHIPLEVEL.ID
    left outer join dbo.TIERCODE on MEMBERSHIPLEVEL.TIERCODEID = TIERCODE.ID
where
    MEMBERSHIPS.ACTIONCODE <> 4
group by
    MEMBERSHIPS.MEMBERSHIPLEVELID,
    MEMBERSHIPLEVEL.SEQUENCE,
    MEMBERSHIPLEVEL.TIERCODEID,
    TIERCODE.SEQUENCE;

-- Group by transaction type.

if @GROUPBY=1
begin

    select
        dbo.UFN_TIERCODE_GETDESCRIPTION(coalesce(MTA.TIER, THISPERIODMEMBERSHIPS.TIER, LASTPERIODMEMBERSHIPS.TIER)) as TIER,
        dbo.UFN_MEMBERSHIPLEVEL_GETNAME(coalesce(MTA.MEMBERSHIPLEVEL, THISPERIODMEMBERSHIPS.MEMBERSHIPLEVELID, LASTPERIODMEMBERSHIPS.MEMBERSHIPLEVELID)) as MEMBERSHIPLEVEL,
        dbo.UFN_MEMBERSHIPTRANSACTION_ACTIONCODE_GETDESCRIPTION(MTA.ACTIONCODE) as LEVELGROUP,
        case MTA.ACTIONCODE
            when null then 0
            else
            (
                    select coalesce(sum(REVENUEAMOUNT), 0)
                    from @MEMBERSHIPTRANSACTIONSANDAMOUNT as MTA2
                    where
                        MTA2.MEMBERSHIPLEVEL = MTA.MEMBERSHIPLEVEL and
                        MTA2.ACTIONCODE = MTA.ACTIONCODE and
                        MTA2.PERIOD = 1 
            ) 
        end as TRANSACTIONREVENUETHISPERIOD,
        case MTA.ACTIONCODE
            when null then 0
            else
        (
                select coalesce(sum(REVENUEAMOUNT), 0)
                from @MEMBERSHIPTRANSACTIONSANDAMOUNT as MTA2
                where
                    MTA2.MEMBERSHIPLEVEL = MTA.MEMBERSHIPLEVEL and
                    MTA2.ACTIONCODE = MTA.ACTIONCODE and
                    MTA2.PERIOD = 0
        ) 
        end as TRANSACTIONREVENUELASTPERIOD,
        coalesce(THISPERIODMEMBERSHIPS.MEMBERSHIPCOUNT, 0) as LEVELMEMBERSTHISPERIOD,
        coalesce(LASTPERIODMEMBERSHIPS.MEMBERSHIPCOUNT, 0) as LEVELMEMBERSLASTPERIOD,
        (
                select
                    count(distinct MEMBERSHIPTRANSACTIONID)
                from
                    @MEMBERSHIPTRANSACTIONSANDAMOUNT as MTA2
                where
                    MTA2.MEMBERSHIPLEVEL = coalesce(MTA.MEMBERSHIPLEVEL, THISPERIODMEMBERSHIPS.MEMBERSHIPLEVELID, LASTPERIODMEMBERSHIPS.MEMBERSHIPLEVELID) and
                    MTA2.ACTIONCODE = MTA.ACTIONCODE and
                    MTA2.PERIOD = 1
        ) as TRANSACTIONMEMBERSTHISPERIOD,
        (
                select
                    count(distinct MEMBERSHIPTRANSACTIONID)
                from
                    @MEMBERSHIPTRANSACTIONSANDAMOUNT as MTA2
                where
                    MTA2.MEMBERSHIPLEVEL = coalesce(MTA.MEMBERSHIPLEVEL, THISPERIODMEMBERSHIPS.MEMBERSHIPLEVELID, LASTPERIODMEMBERSHIPS.MEMBERSHIPLEVELID) and
                    MTA2.ACTIONCODE = MTA.ACTIONCODE and
                    MTA2.PERIOD = 0
        ) as TRANSACTIONMEMBERSLASTPERIOD,
        coalesce([RETENTION].RETENTIONRATE, 0) as LEVELRETENTIONRATE,
        @TOTALMEMBERSTHISPERIOD as TOTALMEMBERSTHISPERIOD,
        @TOTALMEMBERSLASTPERIOD as TOTALMEMBERSLASTPERIOD,
        @TOTALRETENTIONRATE as TOTALRETENTIONRATE,
        @CURRENCYSYMBOL as CURRENCYSYMBOL,
        @CURRENCYISO as ISOCURRENCYCODE,
        @DECIMALDIGITS as DECIMALDIGITS,
        @CURRENCYSYMBOLDISPLAYSETTINGCODE as CURRENCYSYMBOLDISPLAYSETTINGCODE,
        @SELECTEDCURRENCYID as BASECURRENCYID
    from
        @MEMBERSHIPTRANSACTIONSANDAMOUNT as MTA
        inner join MEMBERSHIPLEVEL on MTA.MEMBERSHIPLEVEL = MEMBERSHIPLEVEL.ID
        left join @RETENTIONRATES as [RETENTION] on MTA.MEMBERSHIPLEVEL = [RETENTION].MEMBERSHIPLEVELID
        full outer join @THISPERIODMEMBERSHIPS as THISPERIODMEMBERSHIPS on THISPERIODMEMBERSHIPS.MEMBERSHIPLEVELID = MTA.MEMBERSHIPLEVEL 
        full outer join @LASTPERIODMEMBERSHIPS as LASTPERIODMEMBERSHIPS on LASTPERIODMEMBERSHIPS.MEMBERSHIPLEVELID = coalesce(MTA.MEMBERSHIPLEVEL, THISPERIODMEMBERSHIPS.MEMBERSHIPLEVELID)
    where
        MEMBERSHIPLEVEL.OBTAINLEVELCODE <> 1 --don't show contribution based levels

    group by
        MTA.TIER,
        THISPERIODMEMBERSHIPS.TIER,
        LASTPERIODMEMBERSHIPS.TIER,
        MTA.TIERSEQUENCE,
        THISPERIODMEMBERSHIPS.TIERSEQUENCE,
        LASTPERIODMEMBERSHIPS.TIERSEQUENCE,
        MTA.MEMBERSHIPLEVEL,
        THISPERIODMEMBERSHIPS.MEMBERSHIPLEVELID,
        LASTPERIODMEMBERSHIPS.MEMBERSHIPLEVELID,
        MTA.MEMBERSHIPLEVELSEQUENCE,
        THISPERIODMEMBERSHIPS.MEMBERSHIPLEVELSEQUENCE,
        LASTPERIODMEMBERSHIPS.MEMBERSHIPLEVELSEQUENCE,
        MTA.ACTIONCODE,
        [RETENTION].RETENTIONRATE,
        THISPERIODMEMBERSHIPS.MEMBERSHIPCOUNT,
        LASTPERIODMEMBERSHIPS.MEMBERSHIPCOUNT
    order by
        coalesce(MTA.TIERSEQUENCE, THISPERIODMEMBERSHIPS.TIERSEQUENCE, LASTPERIODMEMBERSHIPS.TIERSEQUENCE),
        coalesce(MTA.MEMBERSHIPLEVELSEQUENCE, THISPERIODMEMBERSHIPS.MEMBERSHIPLEVELSEQUENCE, LASTPERIODMEMBERSHIPS.MEMBERSHIPLEVELSEQUENCE) asc,
        LEVELGROUP;

end
else if @GROUPBY=0
begin

    select
        dbo.UFN_TIERCODE_GETDESCRIPTION(coalesce(MTA.TIER, THISPERIODMEMBERSHIPS.TIER, LASTPERIODMEMBERSHIPS.TIER)) as TIER,
        dbo.UFN_MEMBERSHIPLEVEL_GETNAME(coalesce(MTA.MEMBERSHIPLEVEL, THISPERIODMEMBERSHIPS.MEMBERSHIPLEVELID, LASTPERIODMEMBERSHIPS.MEMBERSHIPLEVELID)) as MEMBERSHIPLEVEL,
        CHANNELCODE.DESCRIPTION as LEVELGROUP,
        case MTA.ACTIONCODE
            when null then 0
            else
            (
                select coalesce(sum(REVENUEAMOUNT), 0)
                from @MEMBERSHIPTRANSACTIONSANDAMOUNT as MTA2
                where
                        MTA2.ACTIONCODE = MTA.ACTIONCODE and
                        MTA2.MEMBERSHIPLEVEL = MTA.MEMBERSHIPLEVEL and
                        MTA2.PERIOD = 1 and
                        (MTA2.CHANNELCODEID = MTA.CHANNELCODEID or
                        (MTA2.CHANNELCODEID is null and MTA.CHANNELCODEID is null))
            ) 
        end as TRANSACTIONREVENUETHISPERIOD,
        case MTA.ACTIONCODE
            when null then 0
            else
            (
                select coalesce(sum(REVENUEAMOUNT), 0)
                from @MEMBERSHIPTRANSACTIONSANDAMOUNT as MTA2
                where
                        MTA2.ACTIONCODE = MTA.ACTIONCODE and
                        MTA2.MEMBERSHIPLEVEL = MTA.MEMBERSHIPLEVEL and
                        MTA2.PERIOD = 0 and
                        (MTA2.CHANNELCODEID = MTA.CHANNELCODEID or
                        (MTA2.CHANNELCODEID is null and MTA.CHANNELCODEID is null))
            ) 
        end as TRANSACTIONREVENUELASTPERIOD,
        coalesce(THISPERIODMEMBERSHIPS.MEMBERSHIPCOUNT, 0) as LEVELMEMBERSTHISPERIOD,
        coalesce(LASTPERIODMEMBERSHIPS.MEMBERSHIPCOUNT, 0) as LEVELMEMBERSLASTPERIOD,
        (
            select
                count(distinct MEMBERSHIPTRANSACTION.MEMBERSHIPID)
            from
                dbo.MEMBERSHIPTRANSACTION
                left join dbo.FINANCIALTRANSACTIONLINEITEM on FINANCIALTRANSACTIONLINEITEM.ID = MEMBERSHIPTRANSACTION.REVENUESPLITID
                left join dbo.REVENUE_EXT on REVENUE_EXT.ID = FINANCIALTRANSACTIONLINEITEM.FINANCIALTRANSACTIONID
            where
                MEMBERSHIPTRANSACTION.MEMBERSHIPLEVELID = coalesce(MTA.MEMBERSHIPLEVEL, THISPERIODMEMBERSHIPS.MEMBERSHIPLEVELID, LASTPERIODMEMBERSHIPS.MEMBERSHIPLEVELID)
                and
                (
                    (MTA.CHANNELCODEID is null and REVENUE_EXT.CHANNELCODEID is null)
                    or (REVENUE_EXT.CHANNELCODEID = MTA.CHANNELCODEID)
                )
                and MEMBERSHIPTRANSACTION.TRANSACTIONDATE >= @THISSTARTDATE
                and MEMBERSHIPTRANSACTION.TRANSACTIONDATE < @THISENDDATE
                and MEMBERSHIPTRANSACTION.ACTIONCODE <> 4
        ) as TRANSACTIONMEMBERSTHISPERIOD,
        (
            select
                count(distinct MEMBERSHIPTRANSACTION.MEMBERSHIPID)
            from
                dbo.MEMBERSHIPTRANSACTION
                left join dbo.FINANCIALTRANSACTIONLINEITEM on FINANCIALTRANSACTIONLINEITEM.ID = MEMBERSHIPTRANSACTION.REVENUESPLITID
                left join dbo.REVENUE_EXT on REVENUE_EXT.ID = FINANCIALTRANSACTIONLINEITEM.FINANCIALTRANSACTIONID
            where
                MEMBERSHIPTRANSACTION.MEMBERSHIPLEVELID = coalesce(MTA.MEMBERSHIPLEVEL, THISPERIODMEMBERSHIPS.MEMBERSHIPLEVELID, LASTPERIODMEMBERSHIPS.MEMBERSHIPLEVELID)
                and
                (
                    (MTA.CHANNELCODEID is null and REVENUE_EXT.CHANNELCODEID is null)
                    or (REVENUE_EXT.CHANNELCODEID = MTA.CHANNELCODEID)
                )
                and MEMBERSHIPTRANSACTION.TRANSACTIONDATE >= @LASTSTARTDATE
                and MEMBERSHIPTRANSACTION.TRANSACTIONDATE < @LASTENDDATE
                and MEMBERSHIPTRANSACTION.ACTIONCODE <> 4
        ) as TRANSACTIONMEMBERSLASTPERIOD,
        coalesce([RETENTION].RETENTIONRATE, 0) as LEVELRETENTIONRATE,
        @TOTALMEMBERSTHISPERIOD as TOTALMEMBERSTHISPERIOD,
        @TOTALMEMBERSLASTPERIOD as TOTALMEMBERSLASTPERIOD,
        @TOTALRETENTIONRATE as TOTALRETENTIONRATE,
        @CURRENCYSYMBOL as CURRENCYSYMBOL,
        @CURRENCYISO as ISOCURRENCYCODE,
        @DECIMALDIGITS as DECIMALDIGITS,
        @CURRENCYSYMBOLDISPLAYSETTINGCODE as CURRENCYSYMBOLDISPLAYSETTINGCODE,
        @SELECTEDCURRENCYID as BASECURRENCYID
    from 
        @MEMBERSHIPTRANSACTIONSANDAMOUNT as MTA
        inner join MEMBERSHIPLEVEL on MTA.MEMBERSHIPLEVEL = MEMBERSHIPLEVEL.ID
        left join @RETENTIONRATES as [RETENTION] on MTA.MEMBERSHIPLEVEL = [RETENTION].MEMBERSHIPLEVELID
        left join dbo.CHANNELCODE on CHANNELCODE.ID = MTA.CHANNELCODEID
        full outer join @THISPERIODMEMBERSHIPS as THISPERIODMEMBERSHIPS on THISPERIODMEMBERSHIPS.MEMBERSHIPLEVELID = MTA.MEMBERSHIPLEVEL 
        full outer join @LASTPERIODMEMBERSHIPS as LASTPERIODMEMBERSHIPS on LASTPERIODMEMBERSHIPS.MEMBERSHIPLEVELID = coalesce(MTA.MEMBERSHIPLEVEL, THISPERIODMEMBERSHIPS.MEMBERSHIPLEVELID)
    where
        MEMBERSHIPLEVEL.OBTAINLEVELCODE <> 1 --don't show contribution based levels

    group by
        MTA.TIER,
        THISPERIODMEMBERSHIPS.TIER,
        LASTPERIODMEMBERSHIPS.TIER,
        MTA.TIERSEQUENCE,
        THISPERIODMEMBERSHIPS.TIERSEQUENCE,
        LASTPERIODMEMBERSHIPS.TIERSEQUENCE,
        MTA.MEMBERSHIPLEVEL,
        THISPERIODMEMBERSHIPS.MEMBERSHIPLEVELID,
        LASTPERIODMEMBERSHIPS.MEMBERSHIPLEVELID,
        MTA.MEMBERSHIPLEVELSEQUENCE,
        THISPERIODMEMBERSHIPS.MEMBERSHIPLEVELSEQUENCE,
        LASTPERIODMEMBERSHIPS.MEMBERSHIPLEVELSEQUENCE,
        MTA.ACTIONCODE,
        MTA.CHANNELCODEID,
        [RETENTION].RETENTIONRATE,
        THISPERIODMEMBERSHIPS.MEMBERSHIPCOUNT,
        LASTPERIODMEMBERSHIPS.MEMBERSHIPCOUNT,
        CHANNELCODE.DESCRIPTION
    order by
        coalesce(MTA.TIERSEQUENCE, THISPERIODMEMBERSHIPS.TIERSEQUENCE, LASTPERIODMEMBERSHIPS.TIERSEQUENCE),
        coalesce(MTA.MEMBERSHIPLEVELSEQUENCE, THISPERIODMEMBERSHIPS.MEMBERSHIPLEVELSEQUENCE, LASTPERIODMEMBERSHIPS.MEMBERSHIPLEVELSEQUENCE) asc,
        LEVELGROUP;

end

return 0;