USP_DATALIST_SEGMENTAVERAGEGIFTAMOUNT_COMBINED

Parameters

Parameter Parameter Type Mode Description
@SEGMENTID uniqueidentifier IN
@SEGMENTID2 uniqueidentifier IN
@SEGMENTID3 uniqueidentifier IN
@NUMYEARS int IN
@CURRENTAPPUSERID uniqueidentifier IN
@SECURITYFEATUREID uniqueidentifier IN
@SECURITYFEATURETYPE tinyint IN
@CURRENCYCODE tinyint IN

Definition

Copy


CREATE procedure dbo.[USP_DATALIST_SEGMENTAVERAGEGIFTAMOUNT_COMBINED]
(
  @SEGMENTID uniqueidentifier = null,
  @SEGMENTID2 uniqueidentifier = null,
  @SEGMENTID3 uniqueidentifier = null,
  @NUMYEARS int = 5,
  @CURRENTAPPUSERID uniqueidentifier = null,
  @SECURITYFEATUREID uniqueidentifier = null,
  @SECURITYFEATURETYPE tinyint = null,
  @CURRENCYCODE tinyint = 1 /* 0 = base, 1 = organization */
)
with execute as owner
as
  set nocount on;

  declare @SQL nvarchar(max);
  declare @SQLWITHJOINHINT nvarchar(max);
  declare @SEGMENTNAME nvarchar(100);
  declare @RECORDTYPEID uniqueidentifier;
  declare @CURRENCYISOCURRENCYCODE nvarchar(6);
  declare @CURRENCYDECIMALDIGITS tinyint;
  declare @CURRENCYSYMBOL nvarchar(10);
  declare @CURRENCYSYMBOLDISPLAYSETTINGCODE tinyint;

  declare @SEGMENT1RESULTS table (
    [SEGMENTNAME] nvarchar(100), 
    [YEAR] int
    [AVERAGEGIFTAMOUNT] money,
    [CURRENCYISOCURRENCYCODE] nvarchar(6), 
    [CURRENCYDECIMALDIGITS] tinyint
    [CURRENCYSYMBOL] nvarchar(10), 
    [CURRENCYSYMBOLDISPLAYSETTINGCODE] tinyint
  );

  declare @SEGMENT2RESULTS table (
    [SEGMENTNAME] nvarchar(100), 
    [YEAR] int
    [AVERAGEGIFTAMOUNT] money,
    [CURRENCYISOCURRENCYCODE] nvarchar(6), 
    [CURRENCYDECIMALDIGITS] tinyint
    [CURRENCYSYMBOL] nvarchar(10), 
    [CURRENCYSYMBOLDISPLAYSETTINGCODE] tinyint
  );

  declare @SEGMENT3RESULTS table (
    [SEGMENTNAME] nvarchar(100), 
    [YEAR] int
    [AVERAGEGIFTAMOUNT] money,
    [CURRENCYISOCURRENCYCODE] nvarchar(6), 
    [CURRENCYDECIMALDIGITS] tinyint
    [CURRENCYSYMBOL] nvarchar(10), 
    [CURRENCYSYMBOLDISPLAYSETTINGCODE] tinyint
  );

  declare @RESULTSTABLE table (
    [SEGMENTNAME] nvarchar(100), 
    [YEAR] int
    [AVERAGEGIFTAMOUNT] money,
    [CURRENCYISOCURRENCYCODE] nvarchar(6), 
    [CURRENCYDECIMALDIGITS] tinyint
    [CURRENCYSYMBOL] nvarchar(10), 
    [CURRENCYSYMBOLDISPLAYSETTINGCODE] tinyint,
    [SEGMENTORDER] int
  );

  declare @NUMBEROFYEARSTOINSERT integer = @NUMYEARS - 1;
  declare @INSERTYEAR bit = 0;
  declare @YEAR int;
  declare @YEARTABLE table (
  [GIFTYEAR] integer
  )

  /* Combine the results of the given segments */
  if not @SEGMENTID is null
    begin
      exec dbo.[USP_SEGMENTAVERAGEGIFTAMOUNT_GETSQL] @SEGMENTID, @NUMYEARS, @CURRENTAPPUSERID, @SECURITYFEATUREID, @SECURITYFEATURETYPE, @CURRENCYCODE, @SQL output, @SEGMENTNAME output, @RECORDTYPEID output, @CURRENCYISOCURRENCYCODE output, @CURRENCYDECIMALDIGITS output, @CURRENCYSYMBOL output, @CURRENCYSYMBOLDISPLAYSETTINGCODE output;
      if @SQL is not null
      begin
        --Try to improve performance by adding a join hint to the sql. If the hint fails, then execute the sql without it.

        begin try
          set @SQLWITHJOINHINT = @SQL + char(13) + 'option (hash join, merge join);';
            insert into @SEGMENT1RESULTS
            exec sp_executesql @SQLWITHJOINHINT, N'@SEGMENTID uniqueidentifier, @SEGMENTNAME nvarchar(100), @NUMYEARS int, @CURRENTAPPUSERID uniqueidentifier, @RECORDTYPEID uniqueidentifier, @CURRENCYISOCURRENCYCODE nvarchar(6), @CURRENCYDECIMALDIGITS tinyint, @CURRENCYSYMBOL nvarchar(10), @CURRENCYSYMBOLDISPLAYSETTINGCODE tinyint'
              @SEGMENTID = @SEGMENTID, @SEGMENTNAME = @SEGMENTNAME, @NUMYEARS = @NUMYEARS
              @CURRENTAPPUSERID = @CURRENTAPPUSERID, @RECORDTYPEID = @RECORDTYPEID,
              @CURRENCYISOCURRENCYCODE = @CURRENCYISOCURRENCYCODE, @CURRENCYDECIMALDIGITS = @CURRENCYDECIMALDIGITS,
              @CURRENCYSYMBOL = @CURRENCYSYMBOL, @CURRENCYSYMBOLDISPLAYSETTINGCODE = @CURRENCYSYMBOLDISPLAYSETTINGCODE;
        end try
        begin catch
          if ERROR_NUMBER() = 8622
            insert into @SEGMENT1RESULTS
              exec sp_executesql @SQL, N'@SEGMENTID uniqueidentifier, @SEGMENTNAME nvarchar(100), @NUMYEARS int, @CURRENTAPPUSERID uniqueidentifier, @RECORDTYPEID uniqueidentifier, @CURRENCYISOCURRENCYCODE nvarchar(6), @CURRENCYDECIMALDIGITS tinyint, @CURRENCYSYMBOL nvarchar(10), @CURRENCYSYMBOLDISPLAYSETTINGCODE tinyint'
                @SEGMENTID = @SEGMENTID, @SEGMENTNAME = @SEGMENTNAME, @NUMYEARS = @NUMYEARS
                @CURRENTAPPUSERID = @CURRENTAPPUSERID, @RECORDTYPEID = @RECORDTYPEID,
                @CURRENCYISOCURRENCYCODE = @CURRENCYISOCURRENCYCODE, @CURRENCYDECIMALDIGITS = @CURRENCYDECIMALDIGITS,
                @CURRENCYSYMBOL = @CURRENCYSYMBOL, @CURRENCYSYMBOLDISPLAYSETTINGCODE = @CURRENCYSYMBOLDISPLAYSETTINGCODE;
          else
            begin
              exec dbo.[USP_RAISE_ERROR];
            end
        end catch
        set @SQL = null;
      end      
      /* Insert correct number of blank years into the 1st segment table depending on @NUMYEARS.  So if a gift was not given to the segment in 
         2007, insert 2007 with 0 for gifts. */
      begin

        set @NUMBEROFYEARSTOINSERT = @NUMYEARS - 1;
        set @INSERTYEAR = 0;

        while @NUMBEROFYEARSTOINSERT >= 0
          begin

            set @YEAR = year(getdate()) - @NUMBEROFYEARSTOINSERT;
            set @INSERTYEAR =  case when exists (select 1 from @SEGMENT1RESULTS AS [RESULTS] where [RESULTS].[YEAR] = @YEAR) then 0 else 1 end;

            -- Insert blank year if no gifts given in that year.  

            if @INSERTYEAR = 1
              begin
                insert into @YEARTABLE
                  select @YEAR;
              end

            set @NUMBEROFYEARSTOINSERT = @NUMBEROFYEARSTOINSERT - 1;
          end

        insert into @SEGMENT1RESULTS
        select
          @SEGMENTNAME,
          [GIFTYEAR],
          0,
          @CURRENCYISOCURRENCYCODE,
          @CURRENCYDECIMALDIGITS,
          @CURRENCYSYMBOL,
          @CURRENCYSYMBOLDISPLAYSETTINGCODE
        from @YEARTABLE;
      end

      insert into @RESULTSTABLE
        select
          [SEGMENTNAME],
          [YEAR], 
          [AVERAGEGIFTAMOUNT],
          [CURRENCYISOCURRENCYCODE], 
          [CURRENCYDECIMALDIGITS], 
          [CURRENCYSYMBOL], 
          [CURRENCYSYMBOLDISPLAYSETTINGCODE],
          1 -- segment order

        from @SEGMENT1RESULTS;
    end

    if not @SEGMENTID2 is null
    begin
      exec dbo.[USP_SEGMENTAVERAGEGIFTAMOUNT_GETSQL] @SEGMENTID2, @NUMYEARS, @CURRENTAPPUSERID, @SECURITYFEATUREID, @SECURITYFEATURETYPE, @CURRENCYCODE, @SQL output, @SEGMENTNAME output, @RECORDTYPEID output, @CURRENCYISOCURRENCYCODE output, @CURRENCYDECIMALDIGITS output, @CURRENCYSYMBOL output, @CURRENCYSYMBOLDISPLAYSETTINGCODE output;
      if @SQL is not null
      begin
        --Try to improve performance by adding a join hint to the sql. If the hint fails, then execute the sql without it.

        begin try
          set @SQLWITHJOINHINT = @SQL + char(13) + 'option (hash join, merge join);';

            insert into @SEGMENT2RESULTS
            exec sp_executesql @SQLWITHJOINHINT, N'@SEGMENTID uniqueidentifier, @SEGMENTNAME nvarchar(100), @NUMYEARS int, @CURRENTAPPUSERID uniqueidentifier, @RECORDTYPEID uniqueidentifier, @CURRENCYISOCURRENCYCODE nvarchar(6), @CURRENCYDECIMALDIGITS tinyint, @CURRENCYSYMBOL nvarchar(10), @CURRENCYSYMBOLDISPLAYSETTINGCODE tinyint'
              @SEGMENTID = @SEGMENTID2, @SEGMENTNAME = @SEGMENTNAME, @NUMYEARS = @NUMYEARS
              @CURRENTAPPUSERID = @CURRENTAPPUSERID, @RECORDTYPEID = @RECORDTYPEID,
              @CURRENCYISOCURRENCYCODE = @CURRENCYISOCURRENCYCODE, @CURRENCYDECIMALDIGITS = @CURRENCYDECIMALDIGITS,
              @CURRENCYSYMBOL = @CURRENCYSYMBOL, @CURRENCYSYMBOLDISPLAYSETTINGCODE = @CURRENCYSYMBOLDISPLAYSETTINGCODE;
        end try
        begin catch
          if ERROR_NUMBER() = 8622
            insert into @SEGMENT2RESULTS
              exec sp_executesql @SQL, N'@SEGMENTID uniqueidentifier, @SEGMENTNAME nvarchar(100), @NUMYEARS int, @CURRENTAPPUSERID uniqueidentifier, @RECORDTYPEID uniqueidentifier, @CURRENCYISOCURRENCYCODE nvarchar(6), @CURRENCYDECIMALDIGITS tinyint, @CURRENCYSYMBOL nvarchar(10), @CURRENCYSYMBOLDISPLAYSETTINGCODE tinyint'
                @SEGMENTID = @SEGMENTID2, @SEGMENTNAME = @SEGMENTNAME, @NUMYEARS = @NUMYEARS
                @CURRENTAPPUSERID = @CURRENTAPPUSERID, @RECORDTYPEID = @RECORDTYPEID,
                @CURRENCYISOCURRENCYCODE = @CURRENCYISOCURRENCYCODE, @CURRENCYDECIMALDIGITS = @CURRENCYDECIMALDIGITS,
                @CURRENCYSYMBOL = @CURRENCYSYMBOL, @CURRENCYSYMBOLDISPLAYSETTINGCODE = @CURRENCYSYMBOLDISPLAYSETTINGCODE;
          else
            begin
              exec dbo.[USP_RAISE_ERROR];
            end
        end catch
        set @SQL = null;
      end

      /* Insert correct number of blank years into the 2nd segment table depending on @NUMYEARS.  So if a gift was not given to the segment in 
         2007, insert 2007 with 0 for gifts. */
      begin

        set @NUMBEROFYEARSTOINSERT = @NUMYEARS - 1;
        set @INSERTYEAR = 0;
        delete from @YEARTABLE;

        while @NUMBEROFYEARSTOINSERT >= 0
          begin

          set @YEAR = year(getdate()) - @NUMBEROFYEARSTOINSERT;
          set @INSERTYEAR =  case when exists (select 1 from @SEGMENT2RESULTS AS [RESULTS] where [RESULTS].[YEAR] = @YEAR) then 0 else 1 end;

          -- Insert blank year if no gifts given in that year.  

          if @INSERTYEAR = 1
            begin
              insert into @YEARTABLE
                select @YEAR;
            end

          set @NUMBEROFYEARSTOINSERT = @NUMBEROFYEARSTOINSERT - 1;
        end

        insert into @SEGMENT2RESULTS
        select
          @SEGMENTNAME,
          [GIFTYEAR],
          0,
          @CURRENCYISOCURRENCYCODE,
          @CURRENCYDECIMALDIGITS,
          @CURRENCYSYMBOL,
          @CURRENCYSYMBOLDISPLAYSETTINGCODE
        from @YEARTABLE;
      end

      insert into @RESULTSTABLE
        select
          [SEGMENTNAME],
          [YEAR], 
          [AVERAGEGIFTAMOUNT],
          [CURRENCYISOCURRENCYCODE], 
          [CURRENCYDECIMALDIGITS], 
          [CURRENCYSYMBOL], 
          [CURRENCYSYMBOLDISPLAYSETTINGCODE],
          2 -- segment order

        from @SEGMENT2RESULTS;

    end

  if not @SEGMENTID3 is null
    begin
      exec dbo.[USP_SEGMENTAVERAGEGIFTAMOUNT_GETSQL] @SEGMENTID3, @NUMYEARS, @CURRENTAPPUSERID, @SECURITYFEATUREID, @SECURITYFEATURETYPE, @CURRENCYCODE, @SQL output, @SEGMENTNAME output, @RECORDTYPEID output, @CURRENCYISOCURRENCYCODE output, @CURRENCYDECIMALDIGITS output, @CURRENCYSYMBOL output, @CURRENCYSYMBOLDISPLAYSETTINGCODE output;
      if @SQL is not null
      begin
        --Try to improve performance by adding a join hint to the sql. If the hint fails, then execute the sql without it.

        begin try
          set @SQLWITHJOINHINT = @SQL + char(13) + 'option (hash join, merge join);';
            insert into @SEGMENT3RESULTS
            exec sp_executesql @SQLWITHJOINHINT, N'@SEGMENTID uniqueidentifier, @SEGMENTNAME nvarchar(100), @NUMYEARS int, @CURRENTAPPUSERID uniqueidentifier, @RECORDTYPEID uniqueidentifier, @CURRENCYISOCURRENCYCODE nvarchar(6), @CURRENCYDECIMALDIGITS tinyint, @CURRENCYSYMBOL nvarchar(10), @CURRENCYSYMBOLDISPLAYSETTINGCODE tinyint'
              @SEGMENTID = @SEGMENTID3, @SEGMENTNAME = @SEGMENTNAME, @NUMYEARS = @NUMYEARS
              @CURRENTAPPUSERID = @CURRENTAPPUSERID, @RECORDTYPEID = @RECORDTYPEID,
              @CURRENCYISOCURRENCYCODE = @CURRENCYISOCURRENCYCODE, @CURRENCYDECIMALDIGITS = @CURRENCYDECIMALDIGITS,
              @CURRENCYSYMBOL = @CURRENCYSYMBOL, @CURRENCYSYMBOLDISPLAYSETTINGCODE = @CURRENCYSYMBOLDISPLAYSETTINGCODE;
        end try
        begin catch
          if ERROR_NUMBER() = 8622
            insert into @SEGMENT3RESULTS
              exec sp_executesql @SQL, N'@SEGMENTID uniqueidentifier, @SEGMENTNAME nvarchar(100), @NUMYEARS int, @CURRENTAPPUSERID uniqueidentifier, @RECORDTYPEID uniqueidentifier, @CURRENCYISOCURRENCYCODE nvarchar(6), @CURRENCYDECIMALDIGITS tinyint, @CURRENCYSYMBOL nvarchar(10), @CURRENCYSYMBOLDISPLAYSETTINGCODE tinyint'
                @SEGMENTID = @SEGMENTID3, @SEGMENTNAME = @SEGMENTNAME, @NUMYEARS = @NUMYEARS
                @CURRENTAPPUSERID = @CURRENTAPPUSERID, @RECORDTYPEID = @RECORDTYPEID,
                @CURRENCYISOCURRENCYCODE = @CURRENCYISOCURRENCYCODE, @CURRENCYDECIMALDIGITS = @CURRENCYDECIMALDIGITS,
                @CURRENCYSYMBOL = @CURRENCYSYMBOL, @CURRENCYSYMBOLDISPLAYSETTINGCODE = @CURRENCYSYMBOLDISPLAYSETTINGCODE;
          else
            begin
              exec dbo.[USP_RAISE_ERROR];
            end
        end catch
        set @SQL = null;
      end
      /* Insert correct number of blank years into the 3rd segment table depending on @NUMYEARS.  So if a gift was not given to the segment in 
         2007, insert 2007 with 0 for gifts. */
      begin

        set @NUMBEROFYEARSTOINSERT = @NUMYEARS - 1;
        set @INSERTYEAR = 0;
        delete from @YEARTABLE;

        while @NUMBEROFYEARSTOINSERT >= 0
          begin

            set @YEAR = year(getdate()) - @NUMBEROFYEARSTOINSERT;
            set @INSERTYEAR =  case when exists (select 1 from @SEGMENT3RESULTS AS [RESULTS] where [RESULTS].[YEAR] = @YEAR) then 0 else 1 end;

            -- Insert blank year if no gifts given in that year.  

            if @INSERTYEAR = 1
              begin
                insert into @YEARTABLE
                  select @YEAR;
              end

            set @NUMBEROFYEARSTOINSERT = @NUMBEROFYEARSTOINSERT - 1;
          end

        insert into @SEGMENT3RESULTS
        select
          @SEGMENTNAME,
          [GIFTYEAR],
          0,
          @CURRENCYISOCURRENCYCODE,
          @CURRENCYDECIMALDIGITS,
          @CURRENCYSYMBOL,
          @CURRENCYSYMBOLDISPLAYSETTINGCODE
        from @YEARTABLE;
      end

    insert into @RESULTSTABLE
      select
        [SEGMENTNAME],
        [YEAR], 
        [AVERAGEGIFTAMOUNT],
        [CURRENCYISOCURRENCYCODE], 
        [CURRENCYDECIMALDIGITS], 
        [CURRENCYSYMBOL], 
        [CURRENCYSYMBOLDISPLAYSETTINGCODE],
        3 -- segment order

      from @SEGMENT3RESULTS;

  end

  select
    [SEGMENTNAME],
    [YEAR], 
    [AVERAGEGIFTAMOUNT],
    [CURRENCYISOCURRENCYCODE], 
    [CURRENCYDECIMALDIGITS], 
    [CURRENCYSYMBOL], 
    [CURRENCYSYMBOLDISPLAYSETTINGCODE]
  from @RESULTSTABLE
  order by [SEGMENTORDER], [YEAR] asc;

  return 0;