USP_DATALIST_MKTREVENUEREPORT
Retrieves detail information by date period for the Revenue report.
Parameters
Parameter | Parameter Type | Mode | Description |
---|---|---|---|
@SEARCHRESULT | nvarchar(64) | IN | Search Result |
@DATEWINDOW | tinyint | IN | Date Window |
@STARTDATE | UDT_FUZZYDATE | IN | From date |
@ENDDATE | UDT_FUZZYDATE | IN | To date |
@CURRENCYCODE | tinyint | IN | Currency |
Definition
Copy
CREATE procedure dbo.[USP_DATALIST_MKTREVENUEREPORT]
(
@SEARCHRESULT nvarchar(64),
@DATEWINDOW tinyint,
@STARTDATE dbo.[UDT_FUZZYDATE] = null,
@ENDDATE dbo.[UDT_FUZZYDATE] = null,
@CURRENCYCODE tinyint = 1 /* 0 = base, 1 = organization */
)
with execute as owner
as
set nocount on;
if @DATEWINDOW not between 1 and 4
begin
raiserror('Unknown Date Window',13,1);
return 1;
end
-- Get currency fields.
declare @CURRENCYISOCURRENCYCODE nvarchar(6);
declare @CURRENCYDECIMALDIGITS tinyint;
declare @CURRENCYSYMBOL nvarchar(10);
declare @CURRENCYSYMBOLDISPLAYSETTINGCODE tinyint;
select
@CURRENCYISOCURRENCYCODE = [ISO4217],
@CURRENCYDECIMALDIGITS = [DECIMALDIGITS],
@CURRENCYSYMBOL = [CURRENCYSYMBOL],
@CURRENCYSYMBOLDISPLAYSETTINGCODE = [SYMBOLDISPLAYSETTINGCODE]
from dbo.[CURRENCY]
where [ID] = dbo.[UFN_CURRENCY_GETORGANIZATIONCURRENCY]();
declare @SEGMENTATIONID uniqueidentifier;
declare @MAILDATE datetime;
declare @COUNTDATE datetime;
declare @MINIMUMDATE datetime = '1/1/1753';
declare @ALL table (
[ID] int identity,
[GIFTS] int,
[REVENUE] money,
[TOTAL_GIFTS] int,
[TOTAL_REVENUE] money,
[TOTAL_OFFERS] int,
[TOTAL_RESPONDERS] int,
[GIFTDATE] datetime
);
--Get list of mailings to process
declare @IDTYPE nvarchar(16);
declare @ID nvarchar(36);
set @IDTYPE = upper(substring(@SEARCHRESULT,1,charindex('|',@SEARCHRESULT)-1));
set @ID = substring(@SEARCHRESULT,charindex('|',@SEARCHRESULT)+1,len(@SEARCHRESULT));
declare @MAILINGCURSOR cursor;
if @IDTYPE = 'PLANITEM'
begin
set @MAILINGCURSOR = cursor local fast_forward for
with [MAILINGS]([ID], [LEVEL]) as
(
select [ID], 0 as [LEVEL]
from dbo.[MKTMARKETINGPLANITEM]
where [ID] = @ID
union all
select [MKTMARKETINGPLANITEM].[ID], [MAILINGS].[LEVEL] + 1
from dbo.[MKTMARKETINGPLANITEM]
inner join [MAILINGS]
on [MKTMARKETINGPLANITEM].[PARENTMARKETINGPLANITEMID] = [MAILINGS].[ID]
)
select [MKTSEGMENTATION].[ID], [MKTSEGMENTATION].[MAILDATE]
from dbo.[MKTSEGMENTATION]
inner join [MAILINGS]
on [MKTSEGMENTATION].[MARKETINGPLANITEMID] = [MAILINGS].[ID]
where [MKTSEGMENTATION].[ACTIVE] = 1;
end
else
begin
if @IDTYPE = 'MARKETING EFFORT'
begin
set @MAILINGCURSOR = cursor local fast_forward for
select [ID], isnull([MAILDATE],[ACTIVATEDATE])
from dbo.[MKTSEGMENTATION]
where [ID] = @ID
and [MKTSEGMENTATION].[ACTIVE] = 1;
end
else
begin
if @IDTYPE = 'APPEAL'
begin
set @MAILINGCURSOR = cursor local fast_forward for
select [MKTSEGMENTATION].[ID], isnull([MKTSEGMENTATION].[MAILDATE],[MKTSEGMENTATION].[ACTIVATEDATE])
from dbo.[MKTSEGMENTATION]
inner join dbo.[MKTSEGMENTATIONACTIVATE] on [MKTSEGMENTATION].[ID] = [MKTSEGMENTATIONACTIVATE].[SEGMENTATIONID]
where [MKTSEGMENTATIONACTIVATE].[APPEALID] = @ID
and [MKTSEGMENTATION].[COMMUNICATIONTYPECODE] = 0 --Exclude appeal mailings
and [MKTSEGMENTATION].[ACTIVE] = 1;
end
else
begin
raiserror('Unknown ID type',13,1);
return 1;
end
end
end
--Process Mailings
open @MAILINGCURSOR;
fetch next from @MAILINGCURSOR into @SEGMENTATIONID, @MAILDATE;
while (@@FETCH_STATUS = 0)
begin
if @STARTDATE is not null
set @MAILDATE = @STARTDATE;
--Don't calculate previous gifts if the count date will be less than the minimum sql date
if @MAILDATE < dateadd(day,1,@MINIMUMDATE)
set @COUNTDATE = @MAILDATE;
else
begin
--Set @COUNTDATE back one datewindow to get previous totals
--@DATEWINDOW: 1 = Daily, 2 = Weekly, 3 = Monthly, 4 = Yearly
select @COUNTDATE =
case @DATEWINDOW
when 1 then dateadd(day,-1,@MAILDATE)
when 2 then dateadd(day,-1,@MAILDATE)
when 3 then dateadd(day,-1,@MAILDATE)
when 4 then dateadd(day,-1,@MAILDATE)
else @MAILDATE
end;
end
--Populate @RESULT table
declare @RESULT table (
[ID] int identity,
[TOTAL_OFFERS] int,
[TOTAL_RESPONDERS] int,
[TOTAL_GIFTS] int,
[TOTAL_REVENUE] money,
[RESPONSERATE] decimal(20,5),
[TOTALORGANIZATIONGIFTAMOUNT] money,
[FIRSTRESPONSEDATE] datetime
);
if @ENDDATE is null
set @ENDDATE = getdate();
while (@COUNTDATE < @ENDDATE)
begin
insert into @RESULT
exec dbo.[USP_MKTSEGMENTATION_GETRESPONSECOUNTS] @SEGMENTATIONID = @SEGMENTATIONID, @ASOFDATE = @COUNTDATE;
--@DATEWINDOW: 1 = Daily, 2 = Weekly, 3 = Monthly, 4 = Yearly
select @COUNTDATE =
case @DATEWINDOW
when 1 then dateadd(day,1,@COUNTDATE)
when 2 then dateadd(week,1,@COUNTDATE)
when 3 then dateadd(day,-1,dateadd(month,1,dateadd(day,1,@COUNTDATE)))
when 4 then dateadd(year,1,@COUNTDATE)
else @MAILDATE
end;
end
--Remaining time in the given time frame
insert into @RESULT
exec dbo.[USP_MKTSEGMENTATION_GETRESPONSECOUNTS] @SEGMENTATIONID = @SEGMENTATIONID, @ASOFDATE = @ENDDATE;
--Populate the @ALL table
declare @PREVIOUS_TOTAL_GIFTS int;
declare @PREVIOUS_TOTAL_REVENUE money;
declare @TOTAL_OFFERS int;
declare @TOTAL_RESPONDERS int;
declare @GIFTS int;
declare @REVENUE money;
declare @TOTAL_GIFTS int;
declare @TOTAL_REVENUE money;
declare @RESPONSERATE decimal(20,5);
declare @TOTAL_ORGANIZATIONREVENUE money;
declare RESULTCURSOR cursor local fast_forward for
select
[TOTAL_OFFERS],
[TOTAL_RESPONDERS],
[TOTAL_GIFTS],
[TOTALORGANIZATIONGIFTAMOUNT] as [TOTAL_REVENUE],
[RESPONSERATE]
from @RESULT
where [ID] not in (select min([ID]) from @RESULT)
order by [ID];
--Reset @COUNTDATE
set @COUNTDATE = @MAILDATE;
--Get values for any date before the starting date
select
@PREVIOUS_TOTAL_GIFTS = [TOTAL_GIFTS],
@PREVIOUS_TOTAL_REVENUE = [TOTALORGANIZATIONGIFTAMOUNT]
from @RESULT
where [ID] in (select min([ID]) from @RESULT);
open RESULTCURSOR;
fetch next from RESULTCURSOR into @TOTAL_OFFERS, @TOTAL_RESPONDERS, @TOTAL_GIFTS, @TOTAL_REVENUE, @RESPONSERATE;
while (@@FETCH_STATUS = 0)
begin
insert into @ALL (
[GIFTS],
[REVENUE],
[TOTAL_GIFTS],
[TOTAL_REVENUE],
[TOTAL_OFFERS],
[TOTAL_RESPONDERS],
[GIFTDATE])
values(
@TOTAL_GIFTS - @PREVIOUS_TOTAL_GIFTS,
@TOTAL_REVENUE - @PREVIOUS_TOTAL_REVENUE,
@TOTAL_GIFTS,
@TOTAL_REVENUE,
@TOTAL_OFFERS,
@TOTAL_RESPONDERS,
@COUNTDATE
);
--@DATEWINDOW: 1 = Daily, 2 = Weekly, 3 = Monthly, 4 = Yearly
select @COUNTDATE =
case @DATEWINDOW
when 1 then dateadd(day,1,@COUNTDATE)
when 2 then dateadd(week,1,@COUNTDATE)
when 3 then dateadd(day,-1,dateadd(month,1,dateadd(day,1,@COUNTDATE)))
when 4 then dateadd(year,1,@COUNTDATE)
else @MAILDATE
end;
set @PREVIOUS_TOTAL_GIFTS = @TOTAL_GIFTS;
set @PREVIOUS_TOTAL_REVENUE = @TOTAL_REVENUE;
fetch next from RESULTCURSOR into @TOTAL_OFFERS, @TOTAL_RESPONDERS, @TOTAL_GIFTS, @TOTAL_REVENUE, @RESPONSERATE;
end;
close RESULTCURSOR;
deallocate RESULTCURSOR;
delete from @RESULT;
fetch next from @MAILINGCURSOR into @SEGMENTATIONID, @MAILDATE;
end
close @MAILINGCURSOR;
deallocate @MAILINGCURSOR;
--Populate the @DISPLAY table
declare @DISPLAY table (
[ID] int identity,
[GIFTS] int,
[PERCENT_GIFTS] decimal(10,4),
[REVENUE] money,
[PERCENT_REVENUE] decimal(10,4),
[AVG_GIFTS] money,
[TOTAL_GIFTS] int,
[PERCENT_TOTALGIFTS] decimal(10,4),
[TOTAL_REVENUE] money,
[PERCENT_TOTALREVENUE] decimal(10,4),
[TOTAL_OFFERS] int,
[TOTAL_RESPONDERS] int,
[RESPONSERATE] decimal(20,5),
[STARTDATE] datetime,
[ENDDATE] datetime
);
insert into @DISPLAY (
[GIFTS],
[REVENUE],
[TOTAL_GIFTS],
[TOTAL_REVENUE],
[TOTAL_OFFERS],
[TOTAL_RESPONDERS],
[STARTDATE]
)
select
sum([GIFTS]),
sum([REVENUE]),
sum([TOTAL_GIFTS]),
sum([TOTAL_REVENUE]),
sum([TOTAL_OFFERS]),
sum([TOTAL_RESPONDERS]),
[GIFTDATE]
from @ALL
group by [GIFTDATE]
order by [GIFTDATE];
--Get totals for computations
select
@TOTAL_GIFTS = [TOTAL_GIFTS],
@TOTAL_REVENUE = [TOTAL_REVENUE]
from
@DISPLAY
group by [ID], [TOTAL_GIFTS], [TOTAL_REVENUE]
having [ID] = max([ID]);
--Do row level computations
update @DISPLAY
set
[PERCENT_GIFTS] = case when @TOTAL_GIFTS = 0 then 0 else cast([GIFTS] as decimal(10,4))/cast(@TOTAL_GIFTS as decimal(10,4)) end,
[PERCENT_REVENUE] = case when @TOTAL_REVENUE = 0 then 0 else cast([REVENUE]/@TOTAL_REVENUE as decimal(10,4)) end,
[AVG_GIFTS] = case when [GIFTS] = 0 then 0 else cast([REVENUE]/[GIFTS] as money) end,
[PERCENT_TOTALGIFTS] = case when @TOTAL_GIFTS = 0 then 0 else cast([TOTAL_GIFTS] as decimal(10,4))/cast(@TOTAL_GIFTS as decimal(10,4)) end,
[PERCENT_TOTALREVENUE] = case when @TOTAL_REVENUE = 0 then 0 else cast([TOTAL_REVENUE]/@TOTAL_REVENUE as decimal(10,4)) end,
[RESPONSERATE] = case when [TOTAL_OFFERS] = 0 then 0 else (cast([TOTAL_RESPONDERS] as decimal(20,5)) / cast([TOTAL_OFFERS] as decimal(20,5))) end,
[ENDDATE] = case @DATEWINDOW
when 1 then [STARTDATE]
when 2 then dateadd(day,-1,dateadd(week,1,[STARTDATE]))
when 3 then dateadd(day,-1,dateadd(month,1,[STARTDATE]))
when 4 then dateadd(day,-1,dateadd(year,1,[STARTDATE]))
else [STARTDATE]
end;
update @DISPLAY
set [ENDDATE] = @ENDDATE
where [ENDDATE] > @ENDDATE;
--Display
select
[ID],
[GIFTS],
[PERCENT_GIFTS],
[REVENUE],
[PERCENT_REVENUE],
[AVG_GIFTS],
[TOTAL_GIFTS],
[PERCENT_TOTALGIFTS],
[TOTAL_REVENUE],
[PERCENT_TOTALREVENUE],
[RESPONSERATE],
[STARTDATE],
[ENDDATE],
@CURRENCYISOCURRENCYCODE as [CURRENCYISOCURRENCYCODE],
@CURRENCYDECIMALDIGITS as [CURRENCYDECIMALDIGITS],
@CURRENCYSYMBOL as [CURRENCYSYMBOL],
@CURRENCYSYMBOLDISPLAYSETTINGCODE as [CURRENCYSYMBOLDISPLAYSETTINGCODE]
from
@DISPLAY;
return 0;