USP_MKTSMARTFIELD_AVERAGEGIFTVALUE
Returns the average gift value for a constituent.
Parameters
Parameter | Parameter Type | Mode | Description |
---|---|---|---|
@RECORDSOURCEID | uniqueidentifier | IN | |
@STARTDATE | datetime | IN | |
@ENDDATE | datetime | IN | |
@DEFAULTVALUE | money | IN | |
@DATEOPTION | tinyint | IN | |
@PASTMONTHS | tinyint | IN | |
@AMOUNTOPTION | tinyint | IN | |
@AMOUNTOPTIONSTART | money | IN | |
@AMOUNTOPTIONEND | money | IN | |
@IDSETREGISTERID | uniqueidentifier | IN | |
@ASOF | datetime | IN | |
@CURRENCYID | uniqueidentifier | IN | |
@SITES | xml | IN |
Definition
Copy
CREATE procedure dbo.[USP_MKTSMARTFIELD_AVERAGEGIFTVALUE]
(
@RECORDSOURCEID uniqueidentifier,
@STARTDATE datetime = null,
@ENDDATE datetime = null,
@DEFAULTVALUE money = 0,
@DATEOPTION tinyint = 0,
@PASTMONTHS tinyint = null,
@AMOUNTOPTION tinyint = 0,
@AMOUNTOPTIONSTART money = null,
@AMOUNTOPTIONEND money = null,
@IDSETREGISTERID uniqueidentifier = null,
@ASOF datetime,
@CURRENCYID uniqueidentifier = null,
@SITES xml = null
)
as
set nocount on;
begin try
declare @ORGANIZATIONCURRENCYID uniqueidentifier = dbo.UFN_CURRENCY_GETORGANIZATIONCURRENCY();
declare @DECIMALDIGITS tinyint;
declare @ROUNDINGTYPECODE tinyint;
set @CURRENCYID = isnull(@CURRENCYID, @ORGANIZATIONCURRENCYID);
select
@DECIMALDIGITS = [CURRENCY].[DECIMALDIGITS],
@ROUNDINGTYPECODE = [CURRENCY].[ROUNDINGTYPECODE]
from dbo.[CURRENCY]
where [CURRENCY].[ID] = @CURRENCYID;
declare @USESITEPARAMETER bit = 1;
--If no sites selected, then do not use the site parameter.
if @SITES is null or not exists (select * from dbo.[UFN_CONSTITUENT_GETSITES_FROMITEMLISTXML](@SITES))
set @USESITEPARAMETER = 0;
declare @IDSET sysname;
declare @IDSETOBJECTTYPE tinyint;
if @IDSETREGISTERID is not null
select
@IDSET = [DBOBJECTNAME],
@IDSETOBJECTTYPE = [OBJECTTYPE]
from dbo.[IDSETREGISTER] where [ID] = @IDSETREGISTERID;
-- get the donor view info based on the record source
declare @DONORSYSNAME sysname;
declare @DONORIDFIELD sysname;
select
@DONORSYSNAME = [OBJECTNAME],
@DONORIDFIELD = [PRIMARYKEYFIELD]
from dbo.[MKTRECORDSOURCE]
left join dbo.[QUERYVIEWCATALOG] on [MKTRECORDSOURCE].[ID] = [QUERYVIEWCATALOG].[ID]
inner join dbo.[MKTRECORDSOURCEFIELDMAPPINGS] on [MKTRECORDSOURCE].[ID] = [MKTRECORDSOURCEFIELDMAPPINGS].[ID]
where
[MKTRECORDSOURCE].[ID] = @RECORDSOURCEID and
dbo.[UFN_MKTRECORDSOURCE_VALIDFORPRODUCT]([MKTRECORDSOURCE].[ID]) = 1;
-- get the gift view info based on the record source
declare @GIFTSYSNAME sysname;
declare @GIFTDONORIDFIELD sysname;
declare @GIFTDATEFIELD sysname;
declare @GIFTAMOUNT sysname;
declare @GIFTDATECHANGEDFIELD sysname;
declare @GIFTIDFIELD sysname;
declare @GIFTDATEADDEDFIELD sysname;
declare @DATECHANGEDFIELD sysname;
declare @ISBBEC bit = (case when dbo.[UFN_MKTRECORDSOURCE_VALIDFORBBEC](@RECORDSOURCEID) = 1 then 1 else 0 end);
select
@GIFTSYSNAME = [OBJECTNAME],
@GIFTDONORIDFIELD = [DONORIDFIELD],
@GIFTDATEFIELD = [DATEFIELD],
@GIFTDATECHANGEDFIELD = isnull([DATECHANGEDFIELD], ''),
@GIFTDATEADDEDFIELD = isnull([DATEADDEDFIELD], ''),
@GIFTAMOUNT = [AMOUNTFIELD],
@GIFTIDFIELD = [QUERYVIEWCATALOG].[PRIMARYKEYFIELD]
from dbo.[MKTGIFTRECORDSOURCE]
left join dbo.[QUERYVIEWCATALOG] on [MKTGIFTRECORDSOURCE].[QUERYVIEWCATALOGID] = [QUERYVIEWCATALOG].[ID]
where [MKTGIFTRECORDSOURCE].[ID] = @RECORDSOURCEID;
--if GIFTDATECHANGEDFIELD and GIFTDATEADDEDFIELD is empty the smart field cannot work
if @GIFTDATECHANGEDFIELD = '' and @GIFTDATEADDEDFIELD = ''
raiserror(N'The gift''s ''Date changed'' field must be mapped for this smart field to process.', 15, 4);
--set the date changed field to what is set
if @GIFTDATECHANGEDFIELD != ''
set @DATECHANGEDFIELD = @GIFTDATECHANGEDFIELD;
else
set @DATECHANGEDFIELD = @GIFTDATEADDEDFIELD;
if @ASOF is null
set @ASOF = '1753-01-01';
--setup start and end date
if @DATEOPTION = 0 -- for All Time
begin
set @ENDDATE = current_timestamp;
set @STARTDATE = '1753-01-01';
end
if @DATEOPTION = 1 -- for Calendar year
begin
set @ENDDATE = current_timestamp;
set @STARTDATE = cast(YEAR(@ENDDATE) as nvarchar) + '-01-01';
end
if @DATEOPTION = 2 --for last N months
begin
set @ENDDATE = current_timestamp;
set @STARTDATE = dateadd(m, -@PASTMONTHS ,@ENDDATE);
end
--build the SQL to execute
declare @SQL nvarchar(max);
set @SQL = 'with [VALUES] as ' + char(13) +
'( ' + char(13) +
' select ' + char(13) +
' [C].[' + @DONORIDFIELD + '], ' + char(13) +
' avg((case when [G].[' + @GIFTDATEFIELD + '] between @STARTDATE and @ENDDATE then ' +
case
when @ISBBEC = 1 then '[REVENUE].[AMOUNTINCURRENCY]'
else 'coalesce([G].[' + @GIFTAMOUNT + '], 0)' end + ' else @DEFAULTVALUE end)) as [MAXAMOUNT] ' + char(13) +
' from dbo.[' + @DONORSYSNAME + '] as [C] ' + char(13) +
' left outer join [' + @GIFTSYSNAME + '] as [G] on [C].[' + @DONORIDFIELD + '] = [G].[' + @GIFTDONORIDFIELD + '] ' + char(13);
if @ISBBEC = 1
set @SQL = @SQL + ' left join dbo.[UFN_REVENUE_GETAMOUNTSINCURRENCY_BULK](@CURRENCYID, @ORGANIZATIONCURRENCYID, @DECIMALDIGITS, @ROUNDINGTYPECODE) as [REVENUE] on [G].[ID] = [REVENUE].[ID]' + char(13);
if @IDSET is not null
begin
if @IDSETOBJECTTYPE = 1
set @SQL = @SQL + ' inner join dbo.[' + @IDSET + ']() on [G].[' + @GIFTIDFIELD + '] = [' + @IDSET + '].[ID] ' + char(13);
else
set @SQL = @SQL + ' inner join dbo.[' + @IDSET + '] on [G].[' + @GIFTIDFIELD + '] = [' + @IDSET + '].[ID] ' + char(13);
end
if @USESITEPARAMETER = 1
set @SQL = @SQL + ' left join dbo.[CONSTITUENTSITE] on [C].[' + @DONORIDFIELD + '] = [CONSTITUENTSITE].[CONSTITUENTID] ' + char(13);
set @SQL = @SQL + ' where coalesce([G].[' + @DATECHANGEDFIELD + '], ''1754-01-01'') > @ASOF ' + char(13);
if @USESITEPARAMETER = 1
set @SQL = @SQL + ' and exists (select [SITEID] from dbo.[UFN_CONSTITUENT_GETSITES_FROMITEMLISTXML](@SITES) where [SITEID] = [CONSTITUENTSITE].[SITEID]) ' + char(13);
set @SQL = @SQL + ' group by [C].[' + @DONORIDFIELD + '] ' + char(13) +
') ' + char(13) +
'select ' + char(13) +
' [VALUES].[' + @DONORIDFIELD + '], ' + char(13);
if @AMOUNTOPTION = 1
set @SQL = @SQL + ' case when [VALUES].[MAXAMOUNT] between @AMOUNTOPTIONSTART and @AMOUNTOPTIONEND then [VALUES].[MAXAMOUNT] else @DEFAULTVALUE end as [MAXAMOUNT]' + char(13);
else
set @SQL = @SQL + ' [VALUES].[MAXAMOUNT] ' + char(13);
set @SQL = @SQL + 'from [VALUES];';
declare @PARAMDEF nvarchar(max);
if @ISBBEC = 1
begin
set @PARAMDEF = N'@STARTDATE datetime, @ENDDATE datetime, @ASOF datetime, @AMOUNTOPTIONSTART money, @AMOUNTOPTIONEND money, @DEFAULTVALUE money, @CURRENCYID uniqueidentifier, @DECIMALDIGITS tinyint, @ROUNDINGTYPECODE tinyint, @ORGANIZATIONCURRENCYID uniqueidentifier, @SITES xml';
exec sp_executesql @SQL, @PARAMDEF,
@STARTDATE = @STARTDATE,
@ENDDATE = @ENDDATE,
@ASOF = @ASOF,
@AMOUNTOPTIONSTART = @AMOUNTOPTIONSTART,
@AMOUNTOPTIONEND = @AMOUNTOPTIONEND,
@DEFAULTVALUE = @DEFAULTVALUE,
@CURRENCYID = @CURRENCYID,
@DECIMALDIGITS = @DECIMALDIGITS,
@ROUNDINGTYPECODE =@ROUNDINGTYPECODE,
@ORGANIZATIONCURRENCYID = @ORGANIZATIONCURRENCYID,
@SITES = @SITES;
end
else
begin
set @PARAMDEF = N'@STARTDATE datetime, @ENDDATE datetime, @ASOF datetime, @AMOUNTOPTIONSTART money, @AMOUNTOPTIONEND money, @DEFAULTVALUE money';
exec sp_executesql @SQL, @PARAMDEF,
@STARTDATE = @STARTDATE,
@ENDDATE = @ENDDATE,
@ASOF = @ASOF,
@AMOUNTOPTIONSTART = @AMOUNTOPTIONSTART,
@AMOUNTOPTIONEND = @AMOUNTOPTIONEND,
@DEFAULTVALUE = @DEFAULTVALUE;
end
end try
begin catch
exec dbo.USP_RAISE_ERROR;
return 1;
end catch
return 0;