USP_MKTSEGMENTATION_CALCULATEDAILYRESPONSES
Parameters
Parameter | Parameter Type | Mode | Description |
---|---|---|---|
@SEGMENTATIONID | uniqueidentifier | IN | |
@CHANGEAGENTID | uniqueidentifier | IN |
Definition
Copy
CREATE procedure dbo.[USP_MKTSEGMENTATION_CALCULATEDAILYRESPONSES]
(
@SEGMENTATIONID uniqueidentifier,
@CHANGEAGENTID uniqueidentifier = null
)
as
set nocount on;
declare @NORMALGIFTSTABLENAME nvarchar(128);
declare @FIRSTRESPONSEDATE date = null;
declare @ACTIVE bit;
declare @COUNT int = 0;
declare @NORMALGIFTS nvarchar(max) = null;
declare @CURRENTDATE datetime = null;
declare @SQL nvarchar(max);
declare @PARAMDEF nvarchar(255);
begin try
select
@FIRSTRESPONSEDATE = [FIRSTRESPONSEDATE],
@ACTIVE = [MKTSEGMENTATION].[ACTIVE]
from dbo.[MKTSEGMENTATION]
left join dbo.[MKTSEGMENTATIONACTIVE] on [MKTSEGMENTATIONACTIVE].[ID] = [MKTSEGMENTATION].[ID]
where [MKTSEGMENTATION].[ID] = @SEGMENTATIONID;
--Only calculate responses we have a first response date for, and the mailing is actually active...
if @FIRSTRESPONSEDATE is not null and @ACTIVE = 1
begin
if @CHANGEAGENTID is null
exec dbo.[USP_CHANGEAGENT_GETORCREATECHANGEAGENT] @CHANGEAGENTID output;
set @CURRENTDATE = getdate();
set @PARAMDEF = '@SEGMENTATIONID uniqueidentifier,' +
'@FIRSTRESPONSEDATE date,' +
'@CHANGEAGENTID uniqueidentifier,' +
'@CURRENTDATE datetime';
--Check for multiple Record Sources. If found, cursor through and union all gifts from each corresponding normal gifts table for the effort.
set @COUNT = (select count(*) from dbo.[MKTSEGMENTATIONACTIVATE] where [SEGMENTATIONID] = @SEGMENTATIONID);
if @COUNT > 1
begin
declare RECORDSOURCECURSOR cursor local fast_forward for
select [IDSETREGISTER].[DBOBJECTNAME]
from dbo.[MKTSEGMENTATIONACTIVATE]
inner join dbo.[IDSETREGISTER] on [IDSETREGISTER].[ID] = [MKTSEGMENTATIONACTIVATE].[NORMALGIFTIDSETREGISTERID]
where [MKTSEGMENTATIONACTIVATE].[SEGMENTATIONID] = @SEGMENTATIONID;
open RECORDSOURCECURSOR;
fetch next from RECORDSOURCECURSOR into @NORMALGIFTSTABLENAME;
while (@@FETCH_STATUS = 0)
begin
if @NORMALGIFTS is null
set @NORMALGIFTS = '(select AMOUNT, [DATE] from ' + @NORMALGIFTSTABLENAME
else
set @NORMALGIFTS = @NORMALGIFTS + ' union all select AMOUNT, [DATE] from ' + @NORMALGIFTSTABLENAME
fetch next from RECORDSOURCECURSOR into @NORMALGIFTSTABLENAME;
end;
close RECORDSOURCECURSOR;
deallocate RECORDSOURCECURSOR;
set @NORMALGIFTS = @NORMALGIFTS + ') g';
end
else
begin
select @NORMALGIFTS = [IDSETREGISTER].[DBOBJECTNAME]
from dbo.[MKTSEGMENTATIONACTIVATE]
inner join dbo.[IDSETREGISTER] on [IDSETREGISTER].[ID] = [MKTSEGMENTATIONACTIVATE].[NORMALGIFTIDSETREGISTERID]
where [MKTSEGMENTATIONACTIVATE].[SEGMENTATIONID] = @SEGMENTATIONID;
end
-- This is going to pull the response dates and revenue from the parameterized table and sum up the total revenue and response count for each day
-- since the first response was received.
-- It also keeps a running total for the cumulative responses and revenue columns.
-- At the end we will have data for responses and revenue for each day of the effort's activity as well as cumulative totals to use when comparing to
-- older efforts responses and revenue for each day of it's life cycle when calculating pace.
-- Since this is called during the effort refresh process we do a merge to account for new and updated information.
set @SQL = 'merge into dbo.MKTSEGMENTATIONDAILYRESPONSE t' + char(13) +
'using (' + char(13) +
'select @SEGMENTATIONID SEGID,' + char(13) +
' n1.NUM DSFR,' + char(13) +
' sum(case when n1.NUM = n2.NUM then isnull(REVENUE,0) else 0 end) DAILYREVENUE,' + char(13) +
' sum(case when n1.NUM = n2.NUM then isnull(RESPONSES,0) else 0 end) DAILYRESPONSES,' + char(13) +
' sum(isnull(REVENUE,0)) CUMULATIVEREVENUE,' + char(13) +
' sum(isnull(RESPONSES,0)) CUMULATIVERESPONSES' + char(13) +
'from dbo.NUMBERS n1' + char(13) +
'inner join dbo.NUMBERS n2 on n2.NUM <= n1.NUM' + char(13) +
'left join (select datediff(DAY, @FIRSTRESPONSEDATE, [DATE]) DSFR, sum(AMOUNT) REVENUE, count(*) RESPONSES' + char(13) +
' from ' + @NORMALGIFTS + ' group by datediff(DAY, @FIRSTRESPONSEDATE, [DATE])) d on d.DSFR = n2.NUM' + char(13) +
'where n1.NUM between 0 and case when datediff(DAY, @FIRSTRESPONSEDATE, @CURRENTDATE) < 119 then datediff(DAY, @FIRSTRESPONSEDATE, @CURRENTDATE) else 119 end' + char(13) +
'group by n1.NUM) s on (s.SEGID = t.SEGMENTATIONID and s.DSFR = t.DAYSSINCEFIRSTRESPONSE)' + char(13) +
'when matched then' + char(13) +
' update set t.DAILYREVENUE = s.DAILYREVENUE,' + char(13) +
' t.DAILYRESPONSES = s.DAILYRESPONSES,' + char(13) +
' t.CUMULATIVEREVENUE = s.CUMULATIVEREVENUE,' + char(13) +
' t.CUMULATIVERESPONSES = s.CUMULATIVERESPONSES,' + char(13) +
' t.CHANGEDBYID = @CHANGEAGENTID,' + char(13) +
' t.DATECHANGED = @CURRENTDATE' + char(13) +
'when not matched then' + char(13) +
' insert (SEGMENTATIONID, DAYSSINCEFIRSTRESPONSE, DAILYREVENUE, DAILYRESPONSES, CUMULATIVEREVENUE, CUMULATIVERESPONSES, ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED)' + char(13) +
' values (s.SEGID, s.DSFR, s.DAILYREVENUE, s.DAILYRESPONSES, s.CUMULATIVEREVENUE, s.CUMULATIVERESPONSES, @CHANGEAGENTID, @CHANGEAGENTID, @CURRENTDATE, @CURRENTDATE);';
exec sp_executesql @SQL, @PARAMDEF,
@SEGMENTATIONID = @SEGMENTATIONID,
@FIRSTRESPONSEDATE = @FIRSTRESPONSEDATE,
@CHANGEAGENTID = @CHANGEAGENTID,
@CURRENTDATE = @CURRENTDATE;
end
end try
begin catch
exec dbo.[USP_RAISE_ERROR];
return 1;
end catch
return 0;