USP_CONSTITUENTSMARTFIELD_HH_REVENUESPLITANDRECOGNITIONS

Calculates aggregate revenue split and recognition information for household members.

Parameters

Parameter Parameter Type Mode Description
@STARTDATE datetime IN
@ENDDATE datetime IN
@CALCULATIONTYPE tinyint IN
@CALCULATEDREVENUE tinyint IN
@ASOF datetime IN
@DATETYPECODE tinyint IN
@STARTDATERECENTDATEUNITCODE tinyint IN
@STARTDATERECENTDATEINTERVAL int IN
@REVENUETYPECODES xml IN
@SELECTIONS xml IN
@REVENUEAPPLICATIONSELECTION uniqueidentifier IN
@RECOGNITIONTYPES xml IN
@INCLUDEHISTORICALDATA bit IN
@CURRENCYID uniqueidentifier IN
@SMARTFIELDID uniqueidentifier IN
@SITES xml IN

Definition

Copy


            CREATE procedure dbo.USP_CONSTITUENTSMARTFIELD_HH_REVENUESPLITANDRECOGNITIONS
            (
                @STARTDATE datetime = null,
                @ENDDATE datetime = null,
                @CALCULATIONTYPE tinyint,
                @CALCULATEDREVENUE tinyint,
                @ASOF datetime,                
                @DATETYPECODE tinyint = null,
                @STARTDATERECENTDATEUNITCODE tinyint = null,
                @STARTDATERECENTDATEINTERVAL int = null,        
                @REVENUETYPECODES xml = null,
                @SELECTIONS xml = null,                
                @REVENUEAPPLICATIONSELECTION uniqueidentifier = null,
                @RECOGNITIONTYPES xml = null,
                @INCLUDEHISTORICALDATA bit = null,
                @CURRENCYID uniqueidentifier = null,
                @SMARTFIELDID uniqueidentifier = null,
                @SITES xml = null
            )
            as
            set nocount on;

            --If the date type is 'Recent dates', then all constituents need to be processed; so set the @ASOF date to null before passing it 

            --to the data function

            if @DATETYPECODE = 1 and @STARTDATERECENTDATEINTERVAL is not null
                set @ASOF = null;

            if @CURRENCYID is null
                set @CURRENCYID = dbo.[UFN_CURRENCY_GETORGANIZATIONCURRENCY]();

            /* Calculate start and end dates */
            declare @CURRENTDATEEARLIESTTIME datetime;
            set @CURRENTDATEEARLIESTTIME = dbo.UFN_DATE_GETEARLIESTTIME(getdate());

            declare @COMPUTEDSTARTDATE datetime;
            declare @COMPUTEDENDDATE datetime;

            if @DATETYPECODE = 0
            begin        
                set @COMPUTEDSTARTDATE = @STARTDATE;
                set @COMPUTEDENDDATE = @ENDDATE;
            end
            else if @DATETYPECODE = 1
            begin
                set @COMPUTEDSTARTDATE = 
                case @STARTDATERECENTDATEUNITCODE
                    when 0 then dateadd(year, -(@STARTDATERECENTDATEINTERVAL), @CURRENTDATEEARLIESTTIME)
                    when 1 then dateadd(quarter, -(@STARTDATERECENTDATEINTERVAL), @CURRENTDATEEARLIESTTIME)
                    when 2 then dateadd(month, -(@STARTDATERECENTDATEINTERVAL), @CURRENTDATEEARLIESTTIME)
                    when 3 then dateadd(week, -(@STARTDATERECENTDATEINTERVAL), @CURRENTDATEEARLIESTTIME)
                    when 4 then dateadd(day, -(@STARTDATERECENTDATEINTERVAL), @CURRENTDATEEARLIESTTIME)
                end;
                set @COMPUTEDENDDATE = null;
            end

      set @COMPUTEDSTARTDATE = dbo.UFN_DATE_GETEARLIESTTIME(@COMPUTEDSTARTDATE);
      set @COMPUTEDENDDATE = dbo.UFN_DATE_GETLATESTTIME(@COMPUTEDENDDATE);

      if object_id('tempdb..#TMP_DATA_HH_REVENUESPLITANDRECOGNITIONS') is not null
          drop table #TMP_DATA_HH_REVENUESPLITANDRECOGNITIONS

            create table #TMP_DATA_HH_REVENUESPLITANDRECOGNITIONS 
            (
                RECORDID uniqueidentifier,
                MEMBERID uniqueidentifier,
                HOUSEHOLDID uniqueidentifier,
                GROUPINGID uniqueidentifier,
                ISHISTORICAL bit,
                AMOUNT money,
                DATE datetime,
                DATEADDED datetime
            )

      if object_id('tempdb..#TMP_MEMBERS_HH_REVENUESPLITANDRECOGNITIONS') is not null
          drop table #TMP_MEMBERS_HH_REVENUESPLITANDRECOGNITIONS

            create table #TMP_MEMBERS_HH_REVENUESPLITANDRECOGNITIONS
            (
                MEMBERID uniqueidentifier,
                HOUSEHOLDID uniqueidentifier
            );

            insert into #TMP_MEMBERS_HH_REVENUESPLITANDRECOGNITIONS(MEMBERID, HOUSEHOLDID)
                select
                    CONSTITUENT.ID,
                    GROUPMEMBER.GROUPID
                from dbo.CONSTITUENT
        --if GROUPDATA.ID cannot be null shouldn't this be an inner join

                --left join dbo.GROUPMEMBER on GROUPMEMBER.MEMBERID = CONSTITUENT.ID  

        --left join dbo.GROUPDATA on GROUPDATA.ID = GROUPMEMBER.GROUPID and GROUPDATA.GROUPTYPECODE = 0  

        --where not GROUPDATA.ID is null;  

        inner join dbo.GROUPMEMBER on GROUPMEMBER.MEMBERID = CONSTITUENT.ID  
        inner join dbo.GROUPDATA on GROUPDATA.ID = GROUPMEMBER.GROUPID 
        where GROUPDATA.GROUPTYPECODE = 0 

        create index IX_TMP_MEMBERS_HH_REVENUESPLITANDRECOGNITIONS_MEMBERID on #TMP_MEMBERS_HH_REVENUESPLITANDRECOGNITIONS (MEMBERID)
        create index IX_TMP_MEMBERS_HH_REVENUESPLITANDRECOGNITIONS_HOUSEHOLDID on #TMP_MEMBERS_HH_REVENUESPLITANDRECOGNITIONS (HOUSEHOLDID)

            if @CALCULATEDREVENUE = 0 or @CALCULATEDREVENUE = 2 --Revenue

            begin
                if object_id('tempdb..#TMP_GROUP_REVENUESPLITS') is not null
            drop table #TMP_GROUP_REVENUESPLITS 

          create table #TMP_GROUP_REVENUESPLITS
                (
                    GROUPID uniqueidentifier,
                    GROUPTYPECODE tinyint,
                    GROUPMEMBERID uniqueidentifier,
                    ISGROUP bit,
                    GROUPMEMBERSHIPSTARTDATE datetime,
                    GROUPMEMBERSHIPENDDATE datetime,
                    GROUPMEMBERSHIPISHISTORICAL bit,
                    REVENUEID uniqueidentifier,
                    REVENUESPLITID uniqueidentifier,
                    REVENUEDATE datetime,
                    REVENUESPLITAMOUNT money,
                    REVENUEDATEADDED datetime,
                    TSLONG bigint
                );

              exec dbo.USP_GROUP_REVENUESPLITS null, @REVENUETYPECODES, null, null, 1, @ASOF, 1, null, @SELECTIONS, @REVENUEAPPLICATIONSELECTION, @CURRENCYID, @SITES;

        --First gather the data for members

                insert into #TMP_DATA_HH_REVENUESPLITANDRECOGNITIONS(RECORDID, MEMBERID, HOUSEHOLDID, GROUPINGID, ISHISTORICAL, AMOUNT, DATE, DATEADDED)
                    select distinct
                        [DATA].REVENUESPLITID,
                        [MEMBERS].MEMBERID,
                        [DATA].GROUPID,
                        [MEMBERS].MEMBERID,
                        [DATA].GROUPMEMBERSHIPISHISTORICAL,
                        [DATA].REVENUESPLITAMOUNT,
                        [DATA].REVENUEDATE,
                        [DATA].REVENUEDATEADDED
                    from #TMP_MEMBERS_HH_REVENUESPLITANDRECOGNITIONS as [MEMBERS]
                    left join #TMP_GROUP_REVENUESPLITS as [DATA] on [DATA].GROUPID = [MEMBERS].HOUSEHOLDID
                    where (@COMPUTEDSTARTDATE is null or [DATA].REVENUEDATE >= @COMPUTEDSTARTDATE)
                        and (@COMPUTEDENDDATE is null or [DATA].REVENUEDATE <= @COMPUTEDENDDATE)
                        and ((@INCLUDEHISTORICALDATA = 0 and [DATA].GROUPMEMBERSHIPISHISTORICAL = 0) or (@INCLUDEHISTORICALDATA = 1) or [DATA].GROUPMEMBERSHIPISHISTORICAL is null);

                --Second gather the data for households and individuals not in a household            

        ;with CTE_DATA as
        (select 
            GROUPID,
            GROUPMEMBERID,
            REVENUESPLITID,
            REVENUESPLITAMOUNT,  
            REVENUEDATE,  
            REVENUEDATEADDED
        from #TMP_GROUP_REVENUESPLITS
        where (@COMPUTEDSTARTDATE is null or REVENUEDATE >= @COMPUTEDSTARTDATE)  
              and (@COMPUTEDENDDATE is null or REVENUEDATE <= @COMPUTEDENDDATE)  
              and ((@INCLUDEHISTORICALDATA = 0 and GROUPMEMBERSHIPISHISTORICAL = 0) or (@INCLUDEHISTORICALDATA = 1) or GROUPMEMBERSHIPISHISTORICAL is null)  
        )
        insert into #TMP_DATA_HH_REVENUESPLITANDRECOGNITIONS(RECORDID, MEMBERID, HOUSEHOLDID, GROUPINGID, ISHISTORICAL, AMOUNT, DATE, DATEADDED)  
             select distinct 
              coalesce([DATA_GROUP].REVENUESPLITID, [DATA_MEMBER].REVENUESPLITID),
              CONSTITUENT.ID,  
              null,  
              CONSTITUENT.ID,  
              0,  
              coalesce([DATA_GROUP].REVENUESPLITAMOUNT, [DATA_MEMBER].REVENUESPLITAMOUNT),
              coalesce([DATA_GROUP].REVENUEDATE, [DATA_MEMBER].REVENUEDATE),
              coalesce([DATA_GROUP].REVENUEDATEADDED, [DATA_MEMBER].REVENUEDATEADDED)
             from dbo.CONSTITUENT  
             left join CTE_DATA as [DATA_GROUP] on [DATA_GROUP].GROUPID = CONSTITUENT.ID
             left join CTE_DATA as [DATA_MEMBER] on [DATA_MEMBER].GROUPMEMBERID = CONSTITUENT.ID
             where 
             CONSTITUENT.ID not in (select GROUPMEMBER.MEMBERID from dbo.GROUPMEMBER
                                    inner join dbo.GROUPDATA on GROUPDATA.ID = GROUPMEMBER.GROUPID
                                    inner join dbo.CONSTITUENTHOUSEHOLD CHH on CHH.ID = GROUPMEMBER.MEMBERID
                                    where GROUPDATA.GROUPTYPECODE = 0  and HOUSEHOLDID is not NULL)

        create index IX_TMP_DATA_HH_REVENUESPLITANDRECOGNITIONS_GROUPINGID on #TMP_DATA_HH_REVENUESPLITANDRECOGNITIONS (GROUPINGID)
        create index IX_TMP_DATA_HH_REVENUESPLITANDRECOGNITIONS_RECORDID on #TMP_DATA_HH_REVENUESPLITANDRECOGNITIONS (RECORDID)

                --Third, gather the data for constituents who do not have any gifts in the @CALCULATEDSTARTDATE/ENDDATE range. This will put $0 on their smart field value

                --This fixes WI60704

                insert into #TMP_DATA_HH_REVENUESPLITANDRECOGNITIONS(RECORDID, MEMBERID, HOUSEHOLDID, GROUPINGID, ISHISTORICAL, AMOUNT, DATE, DATEADDED)
                    select
                        null,
                        CONSTITUENT.ID,
                        null,
                        CONSTITUENT.ID,
                        0,
                        0,
                        null,
                        null
                    from dbo.CONSTITUENT 
                    inner join #TMP_GROUP_REVENUESPLITS as [REVENUEFUNCTIONDATA] on [REVENUEFUNCTIONDATA].GROUPMEMBERID = CONSTITUENT.ID
                    --left join #TMP_DATA_HH_REVENUESPLITANDRECOGNITIONS as [DATA] on [DATA].GROUPINGID = CONSTITUENT.ID

                    where --[DATA].GROUPINGID is null

          not exists (select 1 from #TMP_DATA_HH_REVENUESPLITANDRECOGNITIONS as [DATA] where [DATA].GROUPINGID = CONSTITUENT.ID)

                --Fourth, gather data for members who do not have any gifts yet. This will put $o on their smart field value 

                --This fixes WI75799


                insert into #TMP_DATA_HH_REVENUESPLITANDRECOGNITIONS(RECORDID, MEMBERID, HOUSEHOLDID, GROUPINGID, ISHISTORICAL, AMOUNT, DATE, DATEADDED)
                    select
                        null,
                        [MEMBERS].MEMBERID,
                        null,
                        [MEMBERS].MEMBERID,
                        0,
                        0,
                        null,
                        null
                    from #TMP_MEMBERS_HH_REVENUESPLITANDRECOGNITIONS as [MEMBERS]
                    left join #TMP_DATA_HH_REVENUESPLITANDRECOGNITIONS as [DATA] on [DATA].GROUPINGID = [MEMBERS].MEMBERID
                    where [DATA].GROUPINGID is null

            end
            else --Recognition

            begin
                if object_id('tempdb..#TMP_GROUP_RECOGNITIONCREDITS') is not null
                    drop table #TMP_GROUP_RECOGNITIONCREDITS

                create table #TMP_GROUP_RECOGNITIONCREDITS
                (
                    GROUPID uniqueidentifier,
                    GROUPTYPECODE tinyint,
                    GROUPMEMBERID uniqueidentifier,
                    ISGROUP bit,
                    GROUPMEMBERSHIPSTARTDATE datetime,
                    GROUPMEMBERSHIPENDDATE datetime,
                    GROUPMEMBERSHIPISHISTORICAL bit,
                    RECOGNITIONID uniqueidentifier,
                    REVENUEID uniqueidentifier,
                    REVENUESPLITID uniqueidentifier,
                    REVENUEDATE datetime,
                    REVENUEDATEADDED datetime,
                    REVENUECONSTITUENTID uniqueidentifier,
                    RECOGNITIONDATE datetime,
                    REVENUERECOGNITIONTYPECODEID uniqueidentifier,
                    RECOGNITIONAMOUNT money,
                    RECOGNITIONDATEADDED datetime,
                    TSLONG bigint
                );

                --insert into #TMP_GROUP_RECOGNITIONCREDITS(GROUPID, GROUPTYPECODE, GROUPMEMBERID, ISGROUP, GROUPMEMBERSHIPSTARTDATE, GROUPMEMBERSHIPENDDATE, GROUPMEMBERSHIPISHISTORICAL, RECOGNITIONID, REVENUEID, REVENUESPLITID,

                --    REVENUEDATE, REVENUEDATEADDED, REVENUECONSTITUENTID, RECOGNITIONDATE, REVENUERECOGNITIONTYPECODEID, RECOGNITIONAMOUNT, RECOGNITIONDATEADDED)

                exec dbo.USP_GROUP_RECOGNITIONCREDITS null, @REVENUETYPECODES, null, null, @RECOGNITIONTYPES, 1, @ASOF, 1, null, @SELECTIONS, @REVENUEAPPLICATIONSELECTION, @CURRENCYID, @SITES;

          --select GROUPID, GROUPTYPECODE, GROUPMEMBERID, ISGROUP, GROUPMEMBERSHIPSTARTDATE, GROUPMEMBERSHIPENDDATE, GROUPMEMBERSHIPISHISTORICAL, RECOGNITIONID, REVENUEID, REVENUESPLITID,

                    --        REVENUEDATE, REVENUEDATEADDED, REVENUECONSTITUENTID, RECOGNITIONDATE, REVENUERECOGNITIONTYPECODEID, RECOGNITIONAMOUNT, RECOGNITIONDATEADDED                                                        

                    --from dbo.UFN_GROUP_RECOGNITIONCREDITS(null, @REVENUETYPECODES, null, null, @RECOGNITIONTYPES, 1, @ASOF, 1, null, @SELECTIONS, @REVENUEAPPLICATIONSELECTION);


          create index IX_TMP_GROUP_RECOGNITIONCREDITS_GROUPID on #TMP_GROUP_RECOGNITIONCREDITS (GROUPID)
          create index IX_TMP_GROUP_RECOGNITIONCREDITS_GROUPMEMBERID on #TMP_GROUP_RECOGNITIONCREDITS (GROUPMEMBERID)

                --First gather the data for members

                insert into #TMP_DATA_HH_REVENUESPLITANDRECOGNITIONS(RECORDID, MEMBERID, HOUSEHOLDID, GROUPINGID, ISHISTORICAL, AMOUNT, DATE, DATEADDED)
                    select distinct
                        [DATA].REVENUESPLITID,
                        [MEMBERS].MEMBERID,
                        [DATA].GROUPID,
                        [MEMBERS].MEMBERID,
                        [DATA].GROUPMEMBERSHIPISHISTORICAL,
                        [DATA].RECOGNITIONAMOUNT,
                        [DATA].RECOGNITIONDATE,
                        [DATA].RECOGNITIONDATEADDED
                    from #TMP_MEMBERS_HH_REVENUESPLITANDRECOGNITIONS as [MEMBERS]
                    left join #TMP_GROUP_RECOGNITIONCREDITS as [DATA] on [DATA].GROUPID = [MEMBERS].HOUSEHOLDID
                    where (@COMPUTEDSTARTDATE is null or [DATA].RECOGNITIONDATE >= @COMPUTEDSTARTDATE)
                        and (@COMPUTEDENDDATE is null or [DATA].RECOGNITIONDATE <= @COMPUTEDENDDATE)
                        and ((@INCLUDEHISTORICALDATA = 0 and [DATA].GROUPMEMBERSHIPISHISTORICAL = 0) or (@INCLUDEHISTORICALDATA = 1));

            --Second gather the data for households and individuals not in a household                

      ;with CTE_DATA as
        (select 
              GROUPID,
              GROUPMEMBERID,
              REVENUESPLITID,
              RECOGNITIONAMOUNT,
                          RECOGNITIONDATE,
                          RECOGNITIONDATEADDED
        from #TMP_GROUP_RECOGNITIONCREDITS
        where (@COMPUTEDSTARTDATE is null or REVENUEDATE >= @COMPUTEDSTARTDATE)  
              and (@COMPUTEDENDDATE is null or REVENUEDATE <= @COMPUTEDENDDATE)  
              and ((@INCLUDEHISTORICALDATA = 0 and GROUPMEMBERSHIPISHISTORICAL = 0) or (@INCLUDEHISTORICALDATA = 1) or GROUPMEMBERSHIPISHISTORICAL is null)  
        )
        insert into #TMP_DATA_HH_REVENUESPLITANDRECOGNITIONS(RECORDID, MEMBERID, HOUSEHOLDID, GROUPINGID, ISHISTORICAL, AMOUNT, DATE, DATEADDED)  
             select distinct 
              coalesce([DATA_GROUP].REVENUESPLITID, [DATA_MEMBER].REVENUESPLITID),
              CONSTITUENT.ID,  
              null,  
              CONSTITUENT.ID,  
              0,  
              coalesce([DATA_GROUP].RECOGNITIONAMOUNT, [DATA_MEMBER].RECOGNITIONAMOUNT),
              coalesce([DATA_GROUP].RECOGNITIONDATE, [DATA_MEMBER].RECOGNITIONDATE),
              coalesce([DATA_GROUP].RECOGNITIONDATEADDED, [DATA_MEMBER].RECOGNITIONDATEADDED)
             from dbo.CONSTITUENT  
             left join CTE_DATA as [DATA_GROUP] on [DATA_GROUP].GROUPID = CONSTITUENT.ID
             left join CTE_DATA as [DATA_MEMBER] on [DATA_MEMBER].GROUPMEMBERID = CONSTITUENT.ID
             where 
             CONSTITUENT.ID not in (select GROUPMEMBER.MEMBERID from dbo.GROUPMEMBER
                                    inner join dbo.GROUPDATA on GROUPDATA.ID = GROUPMEMBER.GROUPID
                                    inner join dbo.CONSTITUENTHOUSEHOLD CHH on CHH.ID = GROUPMEMBER.MEMBERID
                                    where GROUPDATA.GROUPTYPECODE = 0 and HOUSEHOLDID is not NULL)

                --Third, gather the data for constituents who do not have any gifts in the @CALCULATEDSTARTDATE/ENDDATE range. This will put $0 on their smart field value

                --This fixes WI60704

                insert into #TMP_DATA_HH_REVENUESPLITANDRECOGNITIONS(RECORDID, MEMBERID, HOUSEHOLDID, GROUPINGID, ISHISTORICAL, AMOUNT, DATE, DATEADDED)
                    select
                        null,
                        CONSTITUENT.ID,
                        null,
                        CONSTITUENT.ID,
                        0,
                        0,
                        null,
                        null
                    from dbo.CONSTITUENT 
                    inner join #TMP_GROUP_RECOGNITIONCREDITS as [RECOGNITIONFUNCTIONDATA] on [RECOGNITIONFUNCTIONDATA].GROUPMEMBERID = CONSTITUENT.ID
                    left join #TMP_DATA_HH_REVENUESPLITANDRECOGNITIONS as [DATA] on [DATA].GROUPINGID = CONSTITUENT.ID
                    where [DATA].GROUPINGID is null

                --Fourth, gather data for members who do not have any gifts yet. This will put $o on their smart field value 

                --This fixes WI75799                

                insert into #TMP_DATA_HH_REVENUESPLITANDRECOGNITIONS(RECORDID, MEMBERID, HOUSEHOLDID, GROUPINGID, ISHISTORICAL, AMOUNT, DATE, DATEADDED)
                    select
                        null,
                        [MEMBERS].MEMBERID,
                        null,
                        [MEMBERS].MEMBERID,
                        0,
                        0,
                        null,
                        null
                    from #TMP_MEMBERS_HH_REVENUESPLITANDRECOGNITIONS as [MEMBERS]
                    left join #TMP_DATA_HH_REVENUESPLITANDRECOGNITIONS as [DATA] on [DATA].GROUPINGID = [MEMBERS].MEMBERID
                    where [DATA].GROUPINGID is null

            end

            declare @revenuesql nvarchar(max)

            -- Backwards compatibility

            if @SMARTFIELDID is not null
                set @revenuesql = 'with SF_CTE (ID, VALUE) as ('
            else
                set @revenuesql = ''

            /* Calculate totals based on calculation type. */
            if @CALCULATIONTYPE = 0 --Max(amount)

                set @revenuesql = @revenuesql + char(10) + '
                    select
                        [DATA].GROUPINGID,
                        coalesce(max([DATA].AMOUNT), 0)
                    from ( 
                            select distinct
                                [DATA].GROUPINGID,
                                [DATA].RECORDID,
                                sum([DATA].AMOUNT) AMOUNT
                            from 
                                #TMP_DATA_HH_REVENUESPLITANDRECOGNITIONS as [DATA]
                            group by [DATA].GROUPINGID, [DATA].RECORDID, [DATA].ISHISTORICAL
                        ) as [DATA]
                    group by [DATA].GROUPINGID'

            else if @CALCULATIONTYPE = 1 --Min(amount)

                set @revenuesql = @revenuesql + char(10) + '
                    select
                        [DATA].GROUPINGID,
                        coalesce(min([DATA].AMOUNT), 0)
                    from ( 
                            select distinct
                                [DATA].GROUPINGID,
                                [DATA].RECORDID,
                                sum([DATA].AMOUNT) AMOUNT
                            from 
                                #TMP_DATA_HH_REVENUESPLITANDRECOGNITIONS as [DATA]
                            group by [DATA].GROUPINGID, [DATA].RECORDID, [DATA].ISHISTORICAL
                        ) as [DATA]
                    group by [DATA].GROUPINGID'

            else if @CALCULATIONTYPE = 2 --Sum(amount)

                set @revenuesql = @revenuesql + char(10) + '
                    select
                        [DATA].GROUPINGID,
                        coalesce(sum([DATA].AMOUNT), 0)
                    from ( 
                            select distinct
                                [DATA].GROUPINGID,
                                [DATA].RECORDID,
                                sum([DATA].AMOUNT) AMOUNT
                            from 
                                #TMP_DATA_HH_REVENUESPLITANDRECOGNITIONS as [DATA]
                            group by [DATA].GROUPINGID, [DATA].RECORDID, [DATA].ISHISTORICAL
                        ) as [DATA]
                    group by [DATA].GROUPINGID'

            else if @CALCULATIONTYPE = 3 --Avg(amount) 

                set @revenuesql = @revenuesql + char(10) + '
                    select
                        [DATA].GROUPINGID,
                        coalesce(avg([DATA].AMOUNT), 0)
                    from ( 
                            select distinct
                                [DATA].GROUPINGID,
                                [DATA].RECORDID,
                                sum([DATA].AMOUNT) AMOUNT
                            from 
                                #TMP_DATA_HH_REVENUESPLITANDRECOGNITIONS as [DATA]
                            group by [DATA].GROUPINGID, [DATA].RECORDID, [DATA].ISHISTORICAL
                        ) as [DATA]
                    group by [DATA].GROUPINGID'

            else if @CALCULATIONTYPE = 4 --First revenue amount

                set @revenuesql = @revenuesql + char(10) + '
                  select
                    [DATA].GROUPINGID,
                    coalesce(sum([DATA].AMOUNT), 0)
                  from
                  (
                      select distinct
                          [DATA].GROUPINGID,
                          [DATA].RECORDID,
                          coalesce(sum([DATA].AMOUNT), 0) as AMOUNT
                      from #TMP_DATA_HH_REVENUESPLITANDRECOGNITIONS as [DATA]
                      where [DATA].RECORDID = (select top 1 RECORDID from #TMP_DATA_HH_REVENUESPLITANDRECOGNITIONS as [SUBD] where [SUBD].GROUPINGID = [DATA].GROUPINGID order by [SUBD].DATE asc, [SUBD].DATEADDED asc)
                      group by [DATA].GROUPINGID, [DATA].RECORDID, [DATA].ISHISTORICAL
                  ) as [DATA]
                  group by [DATA].GROUPINGID
                  union  /*JamesWill 2009-10-14 WI60984, make sure not to add duplicate data for constits with revenue records. (the union does distinct by default)*/
                  select distinct
                      [DATA].GROUPINGID,
                      0
                  from #TMP_DATA_HH_REVENUESPLITANDRECOGNITIONS as [DATA]
                  left join #TMP_DATA_HH_REVENUESPLITANDRECOGNITIONS as [DATA2] on [DATA2].GROUPINGID = [DATA].GROUPINGID
                  where [DATA].RECORDID is null and not exists(select top 1 RECORDID from #TMP_DATA_HH_REVENUESPLITANDRECOGNITIONS where GROUPINGID = [DATA].GROUPINGID and RECORDID is not null)
             group by [DATA].GROUPINGID'

            else if @CALCULATIONTYPE = 5 --Latest revenue amount

                set @revenuesql = @revenuesql + char(10) + '
                    select
                      [DATA].GROUPINGID,
                      coalesce(sum([DATA].AMOUNT), 0)
                    from
                    (
                      select distinct
                          [DATA].GROUPINGID,
                          [DATA].RECORDID,
                          coalesce(sum([DATA].AMOUNT), 0) as AMOUNT
                      from #TMP_DATA_HH_REVENUESPLITANDRECOGNITIONS as [DATA]
                      where [DATA].RECORDID = (select top 1 RECORDID from #TMP_DATA_HH_REVENUESPLITANDRECOGNITIONS as [SUBD] where [SUBD].GROUPINGID = [DATA].GROUPINGID order by [SUBD].DATE desc, [SUBD].DATEADDED desc)
                      group by [DATA].GROUPINGID, [DATA].RECORDID, [DATA].ISHISTORICAL
                    ) as [DATA]
                    group by [DATA].GROUPINGID
                    union --JamesWill 2009-10-14 WI60984, make sure not to add duplicate data for constits with revenue records. (the union does distinct by default)

                    select distinct
                        [DATA].GROUPINGID, 
                        0
                    from #TMP_DATA_HH_REVENUESPLITANDRECOGNITIONS as [DATA]
                    left join #TMP_DATA_HH_REVENUESPLITANDRECOGNITIONS as [DATA2] on [DATA2].GROUPINGID = [DATA].GROUPINGID
                    where [DATA].RECORDID is null and not exists(select top 1 RECORDID from #TMP_DATA_HH_REVENUESPLITANDRECOGNITIONS where GROUPINGID = [DATA].GROUPINGID and RECORDID is not null)
                    group by [DATA].GROUPINGID'

            else if @CALCULATIONTYPE = 6 --Min(date)

                set @revenuesql = @revenuesql + char(10) + '
                    select
                        [DATA].GROUPINGID,
                        min([DATA].DATE)
                    from #TMP_DATA_HH_REVENUESPLITANDRECOGNITIONS as [DATA]
                    group by [DATA].GROUPINGID'

            else if @CALCULATIONTYPE = 7 --Max(date)

                set @revenuesql = @revenuesql + char(10) + '
                    select
                        [DATA].GROUPINGID,
                        max([DATA].DATE)
                    from #TMP_DATA_HH_REVENUESPLITANDRECOGNITIONS as [DATA]
                    group by [DATA].GROUPINGID'

            else if @CALCULATIONTYPE = 8 --Giving years

                set @revenuesql = @revenuesql + char(10) + '
                    select
                        [DATA].GROUPINGID,
                        coalesce(datediff(year,min([DATA].DATE),max([DATA].DATE)), -1) + 1
                    from #TMP_DATA_HH_REVENUESPLITANDRECOGNITIONS as [DATA]
                    group by [DATA].GROUPINGID'

            else if @CALCULATIONTYPE = 9 --Distinct giving years

                set @revenuesql = @revenuesql + char(10) + '
                    select
                        [DATA].GROUPINGID,
                        count(distinct [YEARS].YEAR)
                    from #TMP_DATA_HH_REVENUESPLITANDRECOGNITIONS as [DATA]
                    left join (select distinct [SUBD].GROUPINGID, datepart(year,[SUBD].DATE) as [YEAR] from #TMP_DATA_HH_REVENUESPLITANDRECOGNITIONS as [SUBD]) as [YEARS] on [YEARS].GROUPINGID = [DATA].GROUPINGID
                    group by [DATA].GROUPINGID'

            else if @CALCULATIONTYPE = 10 --Count(records)

                set @revenuesql = @revenuesql + char(10) + '
                    select
                        [DATA].GROUPINGID,
                        count([DATA].RECORDID)
                    from #TMP_DATA_HH_REVENUESPLITANDRECOGNITIONS as [DATA]
                    group by [DATA].GROUPINGID'

            else if @CALCULATIONTYPE = 11 --Consecutive giving years

            begin
                set @revenuesql = '
                    with MAXREVENUEDATE([GROUPINGID], [DATE]) as
                    (
                        select [DATA].GROUPINGID, max([DATA].DATE)
                        from #TMP_DATA_HH_REVENUESPLITANDRECOGNITIONS as [DATA]
                        group by [DATA].GROUPINGID
                        having max([DATA].DATE) > getdate()
                    ),
                    [BANDING]([GROUPINGID], [BAND]) as
                    (
                        select distinct
                            [DATA].GROUPINGID,
                            0
                        from #TMP_DATA_HH_REVENUESPLITANDRECOGNITIONS as [DATA]

                        union all
                        select
                            [DATA].GROUPINGID,
                            (datediff(month, [DATA].[DATE], coalesce([MAXREVENUEDATE].[DATE], getdate()))/12) + 1  
                        from #TMP_DATA_HH_REVENUESPLITANDRECOGNITIONS as [DATA]
                        left join [MAXREVENUEDATE] on [MAXREVENUEDATE].GROUPINGID = [DATA].GROUPINGID
                    ),
                    [GAPS]([GROUPINGID], [BAND]) as
                    (
                        select distinct
                            [BANDING].GROUPINGID,
                            [BANDING].BAND
                        from [BANDING]
                        where not exists (select 1 from [BANDING] as [SUBB] where [SUBB].GROUPINGID = [BANDING].GROUPINGID and [SUBB].BAND = [BANDING].BAND + 1)
                    )'

                if @SMARTFIELDID is not null
                    set @revenuesql = @revenuesql + ', SF_CTE (ID, VALUE) as ('

                set @revenuesql = @revenuesql + char(10) +
                    'select distinct
                        [GAPS].GROUPINGID,
                        min([GAPS].BAND)
                    from [GAPS]
                    group by [GAPS].[GROUPINGID]'
            end
            else if @CALCULATIONTYPE = 12 --First date of largest amount

                set @revenuesql = @revenuesql + char(10) + '
                    select distinct
                        [GROUPINGIDS].GROUPINGID,
                        [DATA].DATE
                    from 
                        (select distinct GROUPINGID from #TMP_DATA_HH_REVENUESPLITANDRECOGNITIONS) [GROUPINGIDS]
                        outer apply (select top 1 [SUBD].DATE from #TMP_DATA_HH_REVENUESPLITANDRECOGNITIONS as [SUBD] where [SUBD].GROUPINGID = [GROUPINGIDS].GROUPINGID order by [SUBD].AMOUNT desc, [SUBD].DATE) DATA'

            else if @CALCULATIONTYPE = 13 --Is annual giver

                set @revenuesql = @revenuesql + char(10) + '
                    select
                        [DATA].GROUPINGID,
                        case
                            when (coalesce(datediff(year, min([DATA].DATE), max([DATA].DATE)), 0) = ([DATES].YEARS - 1)) and ([DATES].YEARS > 1)
                                then cast(1 as bit)
                            else
                                cast(0 as bit)
                        end
                    from #TMP_DATA_HH_REVENUESPLITANDRECOGNITIONS as [DATA]
                    left join (select [SUBD].GROUPINGID, count(distinct datepart(year, [SUBD].DATE)) as [YEARS] from #TMP_DATA_HH_REVENUESPLITANDRECOGNITIONS as [SUBD] group by [SUBD].GROUPINGID) as [DATES] on [DATES].GROUPINGID = [DATA].GROUPINGID
                    group by [DATA].GROUPINGID, [DATES].YEARS'

            else
                raiserror('ERR_USP_CONSTITUENTGROUPSMARTFIELD_REVENUEANDRECOGNITION_AGGREGATE_INVALID_CALCTYPE', 13, 1);

            -- Backwards compatibility

            if @SMARTFIELDID is null
            begin
                insert into #TMP_CONSTITUENTSMARTFIELD_HH_REVENUESPLITANDRECOGNITIONS
                exec sp_executesql @revenuesql;
            end
            else
            begin
                declare @TARGET nvarchar(100)
                declare @TARGET_FIELD nvarchar(128)
                select
                    @TARGET = TABLECATALOG.TABLENAME,
                    @TARGET_FIELD = SMARTFIELD.VALUECOLUMNNAME
                from dbo.SMARTFIELD
                    left join dbo.TABLECATALOG on SMARTFIELD.TABLECATALOGID = TABLECATALOG.ID
                where SMARTFIELD.ID = @SMARTFIELDID

                set @revenuesql = @revenuesql + ')
                    merge dbo.' + @TARGET + ' as target
                    using SF_CTE as source
                    on target.ID = source.ID
                    when matched then
                        update set ' + @TARGET_FIELD + ' = source.VALUE
                    when not matched by target then
                        insert (ID, ' + @TARGET_FIELD + ')
                        values (source.ID, source.VALUE);';

                 exec sp_executesql @revenuesql;

                 select @@ROWCOUNT;
            end