USP_SEGMENTAVERAGEGIFTAMOUNT_GETSQL

Parameters

Parameter Parameter Type Mode Description
@SEGMENTID uniqueidentifier IN
@NUMYEARS int IN
@CURRENTAPPUSERID uniqueidentifier IN
@SECURITYFEATUREID uniqueidentifier IN
@SECURITYFEATURETYPE tinyint IN
@CURRENCYCODE tinyint IN
@SQL nvarchar(max) INOUT
@SEGMENTNAME nvarchar(100) INOUT
@RECORDTYPEID uniqueidentifier INOUT
@CURRENCYISOCURRENCYCODE nvarchar(6) INOUT
@CURRENCYDECIMALDIGITS tinyint INOUT
@CURRENCYSYMBOL nvarchar(10) INOUT
@CURRENCYSYMBOLDISPLAYSETTINGCODE tinyint INOUT

Definition

Copy


CREATE procedure dbo.[USP_SEGMENTAVERAGEGIFTAMOUNT_GETSQL]
(
  @SEGMENTID uniqueidentifier = null,
  @NUMYEARS int = 5,
  @CURRENTAPPUSERID uniqueidentifier = null,
  @SECURITYFEATUREID uniqueidentifier = null,
  @SECURITYFEATURETYPE tinyint = null,
  @CURRENCYCODE tinyint = 1, /* 0 = base, 1 = organization */
  @SQL nvarchar(max) output,
  @SEGMENTNAME nvarchar(100) output,
  @RECORDTYPEID uniqueidentifier output,
  @CURRENCYISOCURRENCYCODE nvarchar(6) output,
  @CURRENCYDECIMALDIGITS tinyint output,
  @CURRENCYSYMBOL nvarchar(10) output,
  @CURRENCYSYMBOLDISPLAYSETTINGCODE tinyint output

)
as
begin
  set nocount on;

  declare @RECORDSOURCEID uniqueidentifier;
  declare @MARKETINGRECORDTYPE tinyint;
  declare @MAILINGSTABLE table([ID] uniqueidentifier not null, [DATATABLE] nvarchar(128) not null, [MAILINGSEGMENTID] uniqueidentifier not null)
  declare @MAILINGSCOUNT int;
  declare @LISTMATCHBACKTABLE nvarchar(128);
  declare @DATATABLE nvarchar(128);
  declare @MAILINGSEGMENTID uniqueidentifier;
  declare @SEGMENTATIONID uniqueidentifier;
  declare @GIFTIDSETNAME nvarchar(128);
  declare @INNERDONORSQL nvarchar(max);
  declare @MATCHBACKFIELD nvarchar(20);

  select
    @SEGMENTNAME = [MKTSEGMENT].[NAME],
    @RECORDSOURCEID = [MKTSEGMENT].[QUERYVIEWCATALOGID],
    @RECORDTYPEID = dbo.[UFN_MKTSEGMENT_GETRECORDTYPE]([MKTSEGMENT].[ID]),
    @MARKETINGRECORDTYPE = dbo.[UFN_MKTSEGMENT_GETMARKETINGRECORDTYPE]([MKTSEGMENT].[ID]),
    @LISTMATCHBACKTABLE = dbo.[UFN_MKTRECORDSOURCE_MAKEMATCHBACKTABLENAME]([MKTSEGMENT].[QUERYVIEWCATALOGID]),
    @MATCHBACKFIELD = (case when [MKTSEGMENT].[SEGMENTTYPECODE] = 3 then '[FINDERNUMBER]' else '[DONORID]' end) --Revenue segments can only be used in acknowledgement mailings which require finder number instead of donor ID for matchback.

  from dbo.[MKTSEGMENT]
  where [MKTSEGMENT].[ID] = @SEGMENTID;

  select 
    @CURRENCYISOCURRENCYCODE = [ISO4217],
    @CURRENCYDECIMALDIGITS = [DECIMALDIGITS],
    @CURRENCYSYMBOL = [CURRENCYSYMBOL],
    @CURRENCYSYMBOLDISPLAYSETTINGCODE = [SYMBOLDISPLAYSETTINGCODE]
  from dbo.[CURRENCY]
  where [ID] = dbo.[UFN_CURRENCY_GETORGANIZATIONCURRENCY]();

  insert into @MAILINGSTABLE
    select distinct
      [MKTSEGMENTATION].[ID],
      dbo.[UFN_MKTSEGMENTATIONACTIVATE_MAKETABLENAME]([MKTSEGMENTATION].[ID]),
      [MKTSEGMENTATIONSEGMENT].[ID]
    from dbo.[MKTSEGMENTATIONSEGMENT]
    inner join dbo.[MKTSEGMENTATION] on [MKTSEGMENTATION].[ID] = [MKTSEGMENTATIONSEGMENT].[SEGMENTATIONID]
    where [MKTSEGMENTATION].[ACTIVE] = 1 and [MKTSEGMENTATIONSEGMENT].[SEGMENTID] = @SEGMENTID;

  --Check if the segment exists, if not, don't execute any code below, just return nothing...

  if @RECORDSOURCEID is not null and exists(select top 1 1 from @MAILINGSTABLE)
    begin
      select @MAILINGSCOUNT = count([ID])
      from @MAILINGSTABLE;

      set @SQL = 'select' + char(13) +
                 '  @SEGMENTNAME as [SEGMENTNAME],' + char(13) +
                 '  year([DONORS].[DATE]) as [YEAR],' + char(13) +
                 '  avg([DONORS].[AMOUNT]) as [AVERAGEGIFTAMOUNT],' + char(13) +
                 '  @CURRENCYISOCURRENCYCODE as [CURRENCYISOCURRENCYCODE],' + char(13) +
                 '  @CURRENCYDECIMALDIGITS as [CURRENCYDECIMALDIGITS],' + char(13) +
                 '  @CURRENCYSYMBOL as [CURRENCYSYMBOL],' + char(13) +
                 '  @CURRENCYSYMBOLDISPLAYSETTINGCODE as [CURRENCYSYMBOLDISPLAYSETTINGCODE]' + char(13);

      --Loop through all the activated mailings that use the segment and join to each mailing's activated data table...

      declare MAILINGCURSOR cursor local fast_forward for
        select [ID], [DATATABLE], [MAILINGSEGMENTID]
        from @MAILINGSTABLE;

      open MAILINGCURSOR;
      fetch next from MAILINGCURSOR into @SEGMENTATIONID, @DATATABLE, @MAILINGSEGMENTID;

      while (@@FETCH_STATUS = 0)
      begin
        select @GIFTIDSETNAME = dbo.[UFN_MKTSELECTION_GETFUNCTIONNAME]([NORMALGIFTIDSETREGISTERID]) from dbo.[MKTSEGMENTATIONACTIVATE] where [SEGMENTATIONID] = @SEGMENTATIONID;

        if @INNERDONORSQL is not null
          set @INNERDONORSQL = @INNERDONORSQL + char(13) + space(6) + 'union' + char(13) + space(6);

        set @INNERDONORSQL = isnull(@INNERDONORSQL, '') + 'select' + char(13) + space(6) +
                                                          '  [GIFTIDSETS].[ID],' + char(13) + space(6) +
                                                          '  [GIFTIDSETS].' + @MATCHBACKFIELD + ',' + char(13) + space(6) +
                                                          '  [GIFTIDSETS].[ORGANIZATIONAMOUNT] as [AMOUNT],' + char(13) + space(6) +
                                                          '  [GIFTIDSETS].[DATE]' + char(13) + space(6) +
                                                          'from dbo.[' + @DATATABLE + '] [DATA]' + char(13);

        if @MARKETINGRECORDTYPE = 1  --Constituent Segment

        begin                 
          set @INNERDONORSQL = @INNERDONORSQL + space(6) + 'inner join dbo.' + @GIFTIDSETNAME + ' [GIFTIDSETS] on [GIFTIDSETS].' + @MATCHBACKFIELD + ' = [DATA].' + @MATCHBACKFIELD + char(13);
        end
        else if @MARKETINGRECORDTYPE = 2  --List segment

        begin
          set @INNERDONORSQL = @INNERDONORSQL + space(6) + 'inner join (select distinct [ID], [GIFTID] from dbo.[' + @LISTMATCHBACKTABLE + '] where [SEGMENTATIONID] = ''' + cast(@SEGMENTATIONID as nvarchar(36)) + ''') as [LISTMATCHBACK] on [LISTMATCHBACK].[ID] = [DATA].[DONORID]' + char(13);       

          set @INNERDONORSQL = @INNERDONORSQL + space(6) + 'inner join dbo.' + @GIFTIDSETNAME + ' [GIFTIDSETS] on [GIFTIDSETS].[ID] = [LISTMATCHBACK].[GIFTID]' + char(13);       
        end
        else if @MARKETINGRECORDTYPE = 3  --Consolidated list segment

        begin
          set @INNERDONORSQL = @INNERDONORSQL + space(6) + 'left join (select distinct' + char(13) + space(6) + 
                            '             [LISTDONORS].[ID],' + char(13) + space(6) + 
                            '             [LISTDONORS].[GIFTID]' + char(13) + space(6) + 
                            '           from dbo.[' + @LISTMATCHBACKTABLE + '] as [LISTDONORS]' + char(13) + space(6) + 
                            '           inner join dbo.[MKTSEGMENTLISTDATA] on [MKTSEGMENTLISTDATA].[ID] = [LISTDONORS].[ID]' + char(13) + space(6) + 
                            '           inner join dbo.[MKTSEGMENTLIST] on [MKTSEGMENTLIST].[ID] = [MKTSEGMENTLISTDATA].[SEGMENTLISTID]' + char(13) + space(6) + 
                            '           inner join dbo.[QUERYVIEWCATALOG] on [QUERYVIEWCATALOG].[ID] = [MKTSEGMENTLIST].[CONSOLIDATEDQUERYVIEWID]' + char(13) + space(6) + 
                            '           where [LISTDONORS].[SEGMENTATIONID] = ''' + cast(@SEGMENTATIONID as nvarchar(36)) + '''' + char(13) + space(6) + 
                            '           and [QUERYVIEWCATALOG].[RECORDTYPEID] = @RECORDTYPEID' + char(13) + space(6) + 
                            '          ) as [LISTMATCHBACK] on cast([LISTMATCHBACK].[ID] as varchar(36)) = [DATA].[DONORID]' + char(13);

          set @INNERDONORSQL = @INNERDONORSQL + space(6) + 'inner join dbo.' + @GIFTIDSETNAME + ' [GIFTIDSETS] on [GIFTIDSETS].[ID] = [LISTMATCHBACK].[GIFTID] or cast([GIFTIDSETS].[DONORID] as varchar(36)) = [DATA].[DONORID]' + char(13);
        end

        set @INNERDONORSQL = @INNERDONORSQL + space(6) + 'where [DATA].[SEGMENTID] = ''' + cast(@MAILINGSEGMENTID as nvarchar(36)) + ''''

        fetch next from MAILINGCURSOR into @SEGMENTATIONID, @DATATABLE, @MAILINGSEGMENTID;
      end

      close MAILINGCURSOR;
      deallocate MAILINGCURSOR;

      set @SQL = @SQL + 
                 'from (' + @INNERDONORSQL + ') as [DONORS]' + char(13) +
       'where year([DONORS].[DATE]) > year(GetDate()) - @NUMYEARS' + char(13) +
                 'and year([DONORS].[DATE]) <= year(GetDate())' + char(13) +
                 'group by year([DONORS].[DATE])' + char(13) +
                 'order by year([DONORS].[DATE])';
      end
end;