USP_CONSTITUENTSMARTFIELD_AGGREGATERECOGNITIONAMOUNTS
Returns aggregate recognition credit values to be used in various constituent revenue smart fields.
Parameters
Parameter | Parameter Type | Mode | Description |
---|---|---|---|
@STARTDATE | datetime | IN | |
@ENDDATE | datetime | IN | |
@TYPECODES | xml | IN | |
@DESIGNATIONS | xml | IN | |
@CALCULATIONTYPE | tinyint | IN | |
@ASOF | datetime | IN | |
@CAMPAIGNS | xml | IN | |
@CURRENCYID | uniqueidentifier | IN | |
@SMARTFIELDID | uniqueidentifier | IN | |
@SITES | xml | IN |
Definition
Copy
CREATE procedure dbo.USP_CONSTITUENTSMARTFIELD_AGGREGATERECOGNITIONAMOUNTS
(
@STARTDATE datetime = null,
@ENDDATE datetime = null,
@TYPECODES xml,
@DESIGNATIONS xml,
@CALCULATIONTYPE tinyint = 0,
@ASOF datetime,
@CAMPAIGNS xml = null,
@CURRENCYID uniqueidentifier = null,
@SMARTFIELDID uniqueidentifier = null,
@SITES xml = null
)
with execute as owner
as
/*
This smart field will return an aggregation of recognition values for ALL constituents in the database
*/
set nocount on;
set @STARTDATE = dbo.UFN_DATE_GETEARLIESTTIME(@STARTDATE);
set @ENDDATE = dbo.UFN_DATE_GETLATESTTIME(@ENDDATE);
declare @DECIMALDIGITS tinyint;
declare @ROUNDINGTYPECODE tinyint;
declare @ORGANIZATIONCURRENCYID uniqueidentifier = dbo.[UFN_CURRENCY_GETORGANIZATIONCURRENCY]();
set @CURRENCYID = isnull(@CURRENCYID, @ORGANIZATIONCURRENCYID);
select
@DECIMALDIGITS = [CURRENCY].[DECIMALDIGITS],
@ROUNDINGTYPECODE = [CURRENCY].[ROUNDINGTYPECODE]
from
dbo.[CURRENCY]
where
[CURRENCY].[ID] = @CURRENCYID;
declare @SITESFILTER table(ID uniqueidentifier primary key);
insert into
@SITESFILTER(ID)
select distinct
T.c.value('(SITEID)[1]','uniqueidentifier')
FROM
@SITES.nodes('/SITES/ITEM') T(c)
create table #CONSTITUENTSITEFITLER (ID uniqueidentifier primary key);
insert into
#CONSTITUENTSITEFITLER(ID)
select distinct
CONSTITUENTSITE.CONSTITUENTID
from
CONSTITUENTSITE
inner join
@SITESFILTER as SITES on SITES.ID = CONSTITUENTSITE.SITEID
if object_id('tempdb..#TMP_REVENUESITEFILTER') is not null
drop table #TMP_REVENUESITEFILTER
create table #TMP_REVENUESITEFILTER(ID uniqueidentifier);
if @SITES is not null
begin
insert into #TMP_REVENUESITEFILTER
select distinct
REVENUE.ID
from
dbo.FINANCIALTRANSACTION as REVENUE
cross apply
dbo.UFN_SITEID_MAPFROM_REVENUEID(REVENUE.ID) as SITES
inner join
@SITESFILTER as SITESFILTER on SITESFILTER.ID = SITES.SITEID
where REVENUE.DELETEDON is null
end
/*
Find all valid constituents based on the date that the smart field was last updated. If there is no @ASOF value then all constituents need to be processed.
*/
declare @CONSTITUENTFILTERVIEW as nvarchar(50) = '#TMP_CONSTITUENTS_AGGREGATERECOGNITIONAMOUNTS'
if object_id('tempdb..#TMP_CONSTITUENTS_AGGREGATERECOGNITIONAMOUNTS') is not null
drop table #TMP_CONSTITUENTS_AGGREGATERECOGNITIONAMOUNTS
create table #TMP_CONSTITUENTS_AGGREGATERECOGNITIONAMOUNTS
(
ID uniqueidentifier primary key
)
if @ASOF is null
begin
if @SITES is null
begin
set @CONSTITUENTFILTERVIEW = 'dbo.CONSTITUENT'
end
else
begin
insert into #TMP_CONSTITUENTS_AGGREGATERECOGNITIONAMOUNTS(ID)
select ID from #CONSTITUENTSITEFITLER
end
end
else
begin
if @SITES is null
begin
insert into #TMP_CONSTITUENTS_AGGREGATERECOGNITIONAMOUNTS(ID)
select CONSTITUENTID from dbo.REVENUERECOGNITION where REVENUERECOGNITION.DATECHANGED > @ASOF and CONSTITUENTID is not null
union select CONSTITUENTID from dbo.REVENUERECOGNITIONAUDIT inner join dbo.CONSTITUENT on CONSTITUENT.ID = REVENUERECOGNITIONAUDIT.CONSTITUENTID where REVENUERECOGNITIONAUDIT.AUDITDATE > @ASOF and CONSTITUENTID is not null
union select CONSTITUENTID from dbo.RECOGNITIONCREDIT where RECOGNITIONCREDIT.DATECHANGED > @ASOF and CONSTITUENTID is not null
union select CONSTITUENTID from dbo.RECOGNITIONCREDITAUDIT inner join dbo.CONSTITUENT on CONSTITUENT.ID = RECOGNITIONCREDITAUDIT.CONSTITUENTID where RECOGNITIONCREDITAUDIT.AUDITDATE > @ASOF
union select CONSTITUENTID from dbo.FINANCIALTRANSACTION where FINANCIALTRANSACTION.DATECHANGED > @ASOF and CONSTITUENTID is not null and FINANCIALTRANSACTION.DELETEDON is null
union select CONSTITUENTID from dbo.FINANCIALTRANSACTIONAUDIT as REVENUEAUDIT inner join dbo.CONSTITUENT on CONSTITUENT.ID = REVENUEAUDIT.CONSTITUENTID where REVENUEAUDIT.TYPECODE in (0,1,2,3,4,5,6,7,8,9,15) and REVENUEAUDIT.AUDITDATE > @ASOF
union select CONSTITUENTID from dbo.FINANCIALTRANSACTION inner join dbo.FINANCIALTRANSACTIONLINEITEM on FINANCIALTRANSACTION.ID = FINANCIALTRANSACTIONLINEITEM.FINANCIALTRANSACTIONID where FINANCIALTRANSACTIONLINEITEM.DATECHANGED > @ASOF and CONSTITUENTID is not null and FINANCIALTRANSACTIONLINEITEM.DELETEDON is null and FINANCIALTRANSACTION.DELETEDON is null
union select ID from dbo.CONSTITUENT where DATEADDED > @ASOF;
end
else
begin
insert into #TMP_CONSTITUENTS_AGGREGATERECOGNITIONAMOUNTS(ID)
select CONSTITUENTID from dbo.REVENUERECOGNITION
inner join #CONSTITUENTSITEFITLER as CONSTITUENTSITEFILTER on CONSTITUENTSITEFILTER.ID = CONSTITUENTID
where REVENUERECOGNITION.DATECHANGED > @ASOF and CONSTITUENTID is not null
union
select CONSTITUENTID from dbo.REVENUERECOGNITIONAUDIT
inner join #CONSTITUENTSITEFITLER as CONSTITUENTSITEFILTER on CONSTITUENTSITEFILTER.ID = CONSTITUENTID
inner join dbo.CONSTITUENT on CONSTITUENT.ID = REVENUERECOGNITIONAUDIT.CONSTITUENTID
where REVENUERECOGNITIONAUDIT.AUDITDATE > @ASOF
union
select CONSTITUENTID from dbo.FINANCIALTRANSACTION
inner join #CONSTITUENTSITEFITLER as CONSTITUENTSITEFILTER on CONSTITUENTSITEFILTER.ID = CONSTITUENTID
where FINANCIALTRANSACTION.DATECHANGED > @ASOF and CONSTITUENTID is not null and FINANCIALTRANSACTION.DELETEDON is null
union
select REVENUEAUDIT.CONSTITUENTID from dbo.FINANCIALTRANSACTIONAUDIT as REVENUEAUDIT
inner join #CONSTITUENTSITEFITLER as CONSTITUENTSITEFILTER on CONSTITUENTSITEFILTER.ID = CONSTITUENTID
inner join dbo.CONSTITUENT on CONSTITUENT.ID = REVENUEAUDIT.CONSTITUENTID
where REVENUEAUDIT.AUDITDATE > @ASOF and REVENUEAUDIT.TYPECODE in (0,1,2,3,4,5,6,7,8,9,15)
union
select CONSTITUENTID from dbo.FINANCIALTRANSACTION
inner join #CONSTITUENTSITEFITLER as CONSTITUENTSITEFILTER on CONSTITUENTSITEFILTER.ID = CONSTITUENTID
inner join dbo.FINANCIALTRANSACTIONLINEITEM on FINANCIALTRANSACTION.ID = FINANCIALTRANSACTIONLINEITEM.FINANCIALTRANSACTIONID
where FINANCIALTRANSACTIONLINEITEM.DATECHANGED > @ASOF and CONSTITUENTID is not null and FINANCIALTRANSACTION.DELETEDON is null and FINANCIALTRANSACTIONLINEITEM.DELETEDON is null
union
select CONSTITUENT.ID from dbo.CONSTITUENT
inner join #CONSTITUENTSITEFITLER as CONSTITUENTSITEFILTER on CONSTITUENTSITEFILTER.ID = CONSTITUENT.ID
where DATEADDED > @ASOF;
end
end
drop table #CONSTITUENTSITEFITLER;
declare @sql as nvarchar(max);
set @sql = '
declare @GIFTTYPESFILTER table(TYPECODE tinyint, APPLICATIONCODE tinyint primary key (TYPECODE, APPLICATIONCODE));
declare @DESIGNATIONSFILTER table(ID uniqueidentifier primary key);
declare @CAMPAIGNSFILTER table(ID uniqueidentifier primary key);
/*@TYPECODES will not be null if this SP is driven from the UI. Just in case, apply the default value.*/
if @TYPECODES is null
begin
insert into @GIFTTYPESFILTER(TYPECODE,APPLICATIONCODE) values (0,0)
end
else
begin
insert into @GIFTTYPESFILTER(TYPECODE,APPLICATIONCODE)
select distinct
case TYPECODEID
when 1 then 1 /*Pledge*/
when 2 then 2 /*Recurring gift*/
when 9 then 4 /*Planned gift*/
when 14 then 8 /*Donor challenge claim*/
else 0
end as TYPECODE,
case TYPECODEID
when 4 then 2 /*Pledge payment*/
when 5 then 3 /*RG payment*/
when 6 then 1 /*Event registration fee*/
when 8 then 7 /*Matching gift payment*/
when 10 then 6 /*Planned gift payment*/
when 11 then 5 /*Membership*/
when 12 then 4 /*Other*/
when 13 then 9 /*Admission*/
when 15 then 13 /*Donor challenge payment*/
else 0 /*Gift, pledge, and recurring gift*/
end as APPLICATIONCODE
from (
select
T.c.value(''(TYPECODEID)[1]'',''tinyint'') as TYPECODEID
from
@TYPECODES.nodes(''/TYPECODES/ITEM'') T(c)
) TYPECODES
if exists (select 1 from @GIFTTYPESFILTER where TYPECODE = 1)
insert into @GIFTTYPESFILTER(TYPECODE,APPLICATIONCODE)
select 1,5 union all select 1,4 /*Add pledges applied to memberships and applied to other*/
if exists (select 1 from @GIFTTYPESFILTER where TYPECODE = 2)
insert into @GIFTTYPESFILTER(TYPECODE,APPLICATIONCODE)
select 2,5 union all select 2,4 /*Add recurring gifts applied to memberships and applied to other*/
/* Allow for donations made from sales orders */
if exists (select 1 from @GIFTTYPESFILTER where TYPECODE = 0)
insert into @GIFTTYPESFILTER(TYPECODE, APPLICATIONCODE)
select 5,0
end
if @DESIGNATIONS is not null
begin
insert into @DESIGNATIONSFILTER(ID) select distinct
T.c.value(''(ID)[1]'',''uniqueidentifier'')
FROM @DESIGNATIONS.nodes(''/DESIGNATIONS/ITEM'') T(c);
end;
if @CAMPAIGNS is not null
begin
insert into @CAMPAIGNSFILTER(ID) select distinct
T.c.value(''(ID)[1]'',''uniqueidentifier'')
FROM @CAMPAIGNS.nodes(''/CAMPAIGNS/ITEM'') T(c);
end;'
/*
Retrieve recognition data based on filter criteria. Only revenue data affecting constituents modified since the @ASOF value will be returned by this SP.
*/
set @sql = @sql + char(10) + 'with REVENUE_CTE (ID, CONSTITUENTID, AMOUNT, DATE, ROW) as
(select
[RECOGNITIONAMOUNTINCURRENCY].[ID],
[RECOGNITIONAMOUNTINCURRENCY].[CONSTITUENTID],
[RECOGNITIONAMOUNTINCURRENCY].[AMOUNTINCURRENCY] - isnull([REFUNDSPLIT].[REFUNDTOTAL],0),
[RECOGNITIONAMOUNTINCURRENCY].[EFFECTIVEDATE],'
-- Include a row number if needed for calculating an extreme.
if @CALCULATIONTYPE = 6
set @sql = @sql + char(10) + 'ROW_NUMBER() over (partition by [RECOGNITIONAMOUNTINCURRENCY].[CONSTITUENTID] order by [RECOGNITIONAMOUNTINCURRENCY].[AMOUNTINCURRENCY] desc, [RECOGNITIONAMOUNTINCURRENCY].[EFFECTIVEDATE] desc) as ROW'
else if @CALCULATIONTYPE = 11
set @sql = @sql + char(10) + 'ROW_NUMBER() over (partition by [RECOGNITIONAMOUNTINCURRENCY].[CONSTITUENTID] order by [RECOGNITIONAMOUNTINCURRENCY].[DATE] asc, [RECOGNITIONAMOUNTINCURRENCY].[REVENUEDATEADDED] asc) as ROW'
else if @CALCULATIONTYPE = 12
set @sql = @sql + char(10) + 'ROW_NUMBER() over (partition by [RECOGNITIONAMOUNTINCURRENCY].[CONSTITUENTID] order by [RECOGNITIONAMOUNTINCURRENCY].[DATE] desc, [RECOGNITIONAMOUNTINCURRENCY].[REVENUEDATEADDED] desc) as ROW'
else
set @sql = @sql + char(10) + '0 as ROW'
set @sql = @sql + char(10) + '
from
(
select RR.ID, RR.CONSTITUENTID, RR.AMOUNTINCURRENCY, RR.EFFECTIVEDATE, RR.APPLICATIONCODE, RR.TRANSACTIONTYPECODE, RR.REVENUECONSTITUENTID, RR.DATE, RR.REVENUEID, RR.REVENUESPLITID, RR.REVENUEDATEADDED, RR.DESIGNATIONID
from dbo.UFN_REVENUERECOGNITION_GETAMOUNTINCURRENCY_BULK(@CURRENCYID, @ORGANIZATIONCURRENCYID, @DECIMALDIGITS, @ROUNDINGTYPECODE) RR
union all
select RC.ID, RC.CONSTITUENTID, RC.AMOUNTINCURRENCY, RC.EFFECTIVEDATE, RC.APPLICATIONCODE, RC.TRANSACTIONTYPECODE, RC.REVENUECONSTITUENTID, RC.DATE, RC.REVENUEID, RC.REVENUESPLITID, RC.REVENUEDATEADDED, RC.DESIGNATIONID
from dbo.UFN_RECOGNITIONCREDIT_GETAMOUNTINCURRENCY_BULK(@CURRENCYID, @ORGANIZATIONCURRENCYID, @DECIMALDIGITS, @ROUNDINGTYPECODE) RC
) RECOGNITIONAMOUNTINCURRENCY
inner join @GIFTTYPESFILTER as GIFTTYPESFILTER on [GIFTTYPESFILTER].[TYPECODE] = [RECOGNITIONAMOUNTINCURRENCY].[TRANSACTIONTYPECODE] and [GIFTTYPESFILTER].[APPLICATIONCODE] = [RECOGNITIONAMOUNTINCURRENCY].[APPLICATIONCODE]
--Accounting for refunds
left join dbo.UFN_CREDIT_GETSPLITREFUNDAMOUNT_BULK() REFUNDSPLIT on REFUNDSPLIT.SOURCELINEITEMID = [RECOGNITIONAMOUNTINCURRENCY].REVENUESPLITID'
if @SITES is not null
set @sql = @sql + char(10) + ' inner join #TMP_REVENUESITEFILTER as REVENUESITEFILTER on REVENUESITEFILTER.ID = RECOGNITIONAMOUNTINCURRENCY.REVENUEID'
-- If the constituent filter is all constituents, then simply filtering out null is faster than joining
if @ASOF is not null
set @sql = @sql + char(10) + 'inner join ' + @CONSTITUENTFILTERVIEW + ' as [CONSTITUENTFILTER] on [CONSTITUENTFILTER].[ID] = [RECOGNITIONAMOUNTINCURRENCY].[CONSTITUENTID]'
set @sql = @sql + char(10) + 'where'
if @ASOF is null
set @sql = @sql + char(10) + '[RECOGNITIONAMOUNTINCURRENCY].[REVENUECONSTITUENTID] is not null and'
set @sql = @sql + char(10) + '
((@STARTDATE is null) or ([RECOGNITIONAMOUNTINCURRENCY].[DATE] >= @STARTDATE))
and ((@ENDDATE is null) or ([RECOGNITIONAMOUNTINCURRENCY].[DATE] <= @ENDDATE))'
if @DESIGNATIONS is not null
set @sql = @sql + char(10) + '
and (
(
[RECOGNITIONAMOUNTINCURRENCY].[DESIGNATIONID] in (
select ID
from @DESIGNATIONSFILTER as DESIGNATIONSFILTER
)
)
or
(
[RECOGNITIONAMOUNTINCURRENCY].TRANSACTIONTYPECODE = 0 and [RECOGNITIONAMOUNTINCURRENCY].APPLICATIONCODE = 1
)
)'
if @CAMPAIGNS is not null
set @sql = @sql + char(10) + '
and (
(
[RECOGNITIONAMOUNTINCURRENCY].REVENUESPLITID in (select REVENUESPLITCAMPAIGN.REVENUESPLITID from dbo.REVENUESPLITCAMPAIGN inner join @CAMPAIGNSFILTER as CAMPAIGNSFILTER on REVENUESPLITCAMPAIGN.CAMPAIGNID = CAMPAIGNSFILTER.ID)
)
or
(
[RECOGNITIONAMOUNTINCURRENCY].TRANSACTIONTYPECODE = 0 and [RECOGNITIONAMOUNTINCURRENCY].APPLICATIONCODE = 1
)
)';
set @sql = @sql + ')';
-- Backwards compatibility
if @SMARTFIELDID is not null
set @sql = @sql + ', SF_CTE (ID, VALUE) as ('
/*
Calculate totals based on calculation type.
*/
if @CALCULATIONTYPE = 0 --Max(amount)
set @sql = @sql + char(10) + '
select
CONSTITUENTFILTER.ID,
coalesce(max(REVENUERECORDS.AMOUNT),0) as VALUE
from
' + @CONSTITUENTFILTERVIEW + ' as CONSTITUENTFILTER
left outer join REVENUE_CTE as REVENUERECORDS on CONSTITUENTFILTER.ID = REVENUERECORDS.CONSTITUENTID
group by
CONSTITUENTFILTER.ID';
else if @CALCULATIONTYPE = 1 --Min(amount)
set @sql = @sql + char(10) + '
select
CONSTITUENTFILTER.ID,
coalesce(min(REVENUERECORDS.AMOUNT),0) as VALUE
from
' + @CONSTITUENTFILTERVIEW + ' as CONSTITUENTFILTER
left outer join REVENUE_CTE as REVENUERECORDS on CONSTITUENTFILTER.ID = REVENUERECORDS.CONSTITUENTID
group by
CONSTITUENTFILTER.ID';
else if @CALCULATIONTYPE = 2 --Sum(amount)
set @sql = @sql + char(10) + '
select
CONSTITUENTFILTER.ID,
coalesce(sum(REVENUERECORDS.AMOUNT),0) as VALUE
from
' + @CONSTITUENTFILTERVIEW + ' as CONSTITUENTFILTER
left outer join REVENUE_CTE as REVENUERECORDS on CONSTITUENTFILTER.ID = REVENUERECORDS.CONSTITUENTID
group by
CONSTITUENTFILTER.ID';
else if @CALCULATIONTYPE = 3 --Avg(amount)
set @sql = @sql + char(10) + '
select
CONSTITUENTFILTER.ID,
coalesce(avg(REVENUERECORDS.AMOUNT),0) as VALUE
from
' + @CONSTITUENTFILTERVIEW + ' as CONSTITUENTFILTER
left outer join REVENUE_CTE as REVENUERECORDS on CONSTITUENTFILTER.ID = REVENUERECORDS.CONSTITUENTID
group by
CONSTITUENTFILTER.ID';
else if @CALCULATIONTYPE = 4 --Min(date)
set @sql = @sql + char(10) + '
select
CONSTITUENTFILTER.ID,
min(REVENUERECORDS.DATE) as VALUE
from
' + @CONSTITUENTFILTERVIEW + ' as CONSTITUENTFILTER
left outer join REVENUE_CTE as REVENUERECORDS on CONSTITUENTFILTER.ID = REVENUERECORDS.CONSTITUENTID
group by
CONSTITUENTFILTER.ID';
else if @CALCULATIONTYPE = 5 --Max(date)
set @sql = @sql + char(10) + '
select
CONSTITUENTFILTER.ID,
max(REVENUERECORDS.DATE) as VALUE
from
' + @CONSTITUENTFILTERVIEW + ' as CONSTITUENTFILTER
left outer join REVENUE_CTE as REVENUERECORDS on CONSTITUENTFILTER.ID = REVENUERECORDS.CONSTITUENTID
group by
CONSTITUENTFILTER.ID';
else if @CALCULATIONTYPE = 6 --Largest revenue date
set @sql = @sql + char(10) + '
select
CONSTITUENTFILTER.ID,
REVENUERECORDS.DATE as VALUE
from
' + @CONSTITUENTFILTERVIEW + ' as CONSTITUENTFILTER
left outer join REVENUE_CTE as REVENUERECORDS on CONSTITUENTFILTER.ID = REVENUERECORDS.CONSTITUENTID
where
REVENUERECORDS.ID is null or REVENUERECORDS.ROW = 1';
else if @CALCULATIONTYPE = 7 --Giving years
set @sql = @sql + char(10) + '
select
CONSTITUENTFILTER.ID,
coalesce(datediff(year,min(REVENUERECORDS.DATE), max(REVENUERECORDS.DATE)), 0) as VALUE
from
' + @CONSTITUENTFILTERVIEW + ' as CONSTITUENTFILTER
left outer join REVENUE_CTE as REVENUERECORDS on CONSTITUENTFILTER.ID = REVENUERECORDS.CONSTITUENTID
group by
CONSTITUENTFILTER.ID';
else if @CALCULATIONTYPE = 8 --Distinct giving years
set @sql = @sql + char(10) + '
select
CONSTITUENTFILTER.ID,
count(REVENUEDATES.YEAR) as VALUE
from
' + @CONSTITUENTFILTERVIEW + ' as CONSTITUENTFILTER
left outer join (
select distinct
REVENUERECORDS.CONSTITUENTID,
datepart(year, REVENUERECORDS.DATE) as YEAR
from REVENUE_CTE as REVENUERECORDS
) as REVENUEDATES on REVENUEDATES.CONSTITUENTID = CONSTITUENTFILTER.ID
group by
CONSTITUENTFILTER.ID';
else if @CALCULATIONTYPE = 9 --Is annual giver
set @sql = @sql + char(10) + '
select
CONSTITUENTFILTER.ID,
case
when
coalesce(datediff(year,min(REVENUERECORDS.DATE), max(REVENUERECORDS.DATE)), 0) = (count(distinct datepart(year, REVENUERECORDS.DATE)) - 1)
and count(distinct datepart(year, REVENUERECORDS.DATE)) > 1
then
cast(1 as bit)
else
cast(0 as bit)
end as VALUE
from
' + @CONSTITUENTFILTERVIEW + ' as CONSTITUENTFILTER
left outer join REVENUE_CTE as REVENUERECORDS on CONSTITUENTFILTER.ID = REVENUERECORDS.CONSTITUENTID
group by
CONSTITUENTFILTER.ID';
else if @CALCULATIONTYPE = 10 --Count(revenue)
set @sql = @sql + char(10) + '
select
CONSTITUENTFILTER.ID,
count(REVENUERECORDS.ID) as VALUE
from
' + @CONSTITUENTFILTERVIEW + ' as CONSTITUENTFILTER
left outer join REVENUE_CTE as REVENUERECORDS on CONSTITUENTFILTER.ID = REVENUERECORDS.CONSTITUENTID
group by
CONSTITUENTFILTER.ID';
else if @CALCULATIONTYPE in (11, 12) --First revenue amount, Latest revenue amount
set @sql = @sql + char(10) + '
select
CONSTITUENTFILTER.ID,
coalesce(REVENUERECORDS.AMOUNT, 0) as VALUE
from
' + @CONSTITUENTFILTERVIEW + ' as CONSTITUENTFILTER
left outer join REVENUE_CTE as REVENUERECORDS on CONSTITUENTFILTER.ID = REVENUERECORDS.CONSTITUENTID
where
REVENUERECORDS.ID is null or REVENUERECORDS.ROW = 1';
-- Backwards compatibility
if @SMARTFIELDID is null
exec sp_executesql @sql, N'@ASOF datetime,
@CURRENCYID uniqueidentifier,
@ORGANIZATIONCURRENCYID uniqueidentifier,
@DECIMALDIGITS tinyint,
@ROUNDINGTYPECODE tinyint,
@STARTDATE datetime,
@ENDDATE datetime,
@TYPECODES xml,
@DESIGNATIONS xml,
@CAMPAIGNS xml
',
@ASOF,
@CURRENCYID,
@ORGANIZATIONCURRENCYID,
@DECIMALDIGITS,
@ROUNDINGTYPECODE,
@STARTDATE,
@ENDDATE,
@TYPECODES,
@DESIGNATIONS,
@CAMPAIGNS
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 @sql = @sql + ')
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 @sql, N'@ASOF datetime,
@CURRENCYID uniqueidentifier,
@ORGANIZATIONCURRENCYID uniqueidentifier,
@DECIMALDIGITS tinyint,
@ROUNDINGTYPECODE tinyint,
@STARTDATE datetime,
@ENDDATE datetime,
@TYPECODES xml,
@DESIGNATIONS xml,
@CAMPAIGNS xml
',
@ASOF,
@CURRENCYID,
@ORGANIZATIONCURRENCYID,
@DECIMALDIGITS,
@ROUNDINGTYPECODE,
@STARTDATE,
@ENDDATE,
@TYPECODES,
@DESIGNATIONS,
@CAMPAIGNS;
select @@ROWCOUNT;
end