USP_DATALIST_BREAKEVENANALYSIS
Return data required for the Breakeven Analysis of a Marketing Effort.
Parameters
Parameter | Parameter Type | Mode | Description |
---|---|---|---|
@SEGMENTATIONID | uniqueidentifier | IN | Input parameter indicating the context ID for the data list. |
Definition
Copy
CREATE procedure dbo.[USP_DATALIST_BREAKEVENANALYSIS]
(
@SEGMENTATIONID uniqueidentifier
)
with execute as owner
as
set nocount on;
declare @DATA table (
[MAILINGNAME] nvarchar(100),
[MAILINGDESCRIPTION] nvarchar(255),
[MAILINGCODE] nvarchar(10),
[MAILINGSITE] nvarchar(1024),
[PACKAGEID] uniqueidentifier,
[PACKAGENAME] nvarchar(100),
[SEGMENTID] uniqueidentifier,
[SEGMENTNAME] nvarchar(100),
[COSTPERPIECE] money,
[OFFERS] integer,
[RESPONDERS] integer,
[RESPONSES] integer,
[GIFTAMOUNT] money,
[AVERAGEGIFTAMOUNT] money,
[SEQUENCE] integer);
declare @SEGMENTCOUNTS table (
[OFFERS] integer,
[RESPONDERS] integer,
[RESPONSES] integer,
[GIFTAMOUNT] money,
[AVERAGEGIFTAMOUNT] money,
[ORGANIZATIONTOTALGIFTAMOUNT] money,
[ORGANIZATIONAVERAGEGIFTAMOUNT] money);
declare @MAILINGNAME nvarchar(100);
declare @MAILINGDESCRIPTION nvarchar(255);
declare @MAILINGCODE nvarchar(10);
declare @MAILINGSITE nvarchar(1024);
declare @MAILINGSEGMENTID uniqueidentifier;
declare @FIXEDCOST money = 0;
declare @FIXEDCOSTPERPIECE money = 0;
declare @SEGMENTID uniqueidentifier;
declare @SEGMENTNAME nvarchar(100);
declare @PACKAGEID uniqueidentifier;
declare @PACKAGENAME nvarchar(100);
declare @PACKAGECOST money = 0;
declare @PACKAGECOSTDISTRIBUTIONMETHODCODE tinyint;
declare @COSTPERRECORD money = 0;
declare @TOTALOFFERS integer = 0;
declare @SEQUENCE integer = 0;
declare @INSERTCOST money = 0;
begin try
/* Get any relevant mailing information */
select
@MAILINGNAME = [MKTSEGMENTATION].[NAME],
@MAILINGDESCRIPTION = [MKTSEGMENTATION].[DESCRIPTION],
@MAILINGCODE = [MKTSEGMENTATION].[CODE],
@MAILINGSITE = dbo.[UFN_TRANSLATIONFUNCTION_SITE_GETNAME]([MKTSEGMENTATION].[SITEID]),
@FIXEDCOST = isnull([MKTSEGMENTATIONBUDGET].[FIXEDCOST], 0)
from dbo.[MKTSEGMENTATION]
inner join dbo.[MKTSEGMENTATIONBUDGET] on [MKTSEGMENTATIONBUDGET].[ID] = [MKTSEGMENTATION].[ID]
where [MKTSEGMENTATION].[ID] = @SEGMENTATIONID;
/* Get segment information */
declare SEGMENTCURSOR cursor local fast_forward for
select
[P].[ID],
coalesce([P].[NAME], '') as [PACKAGENAME],
[SP].[UNITCOST],
[SP].[COSTDISTRIBUTIONMETHODCODE],
[SS].[ID] as [SEGMENTID],
coalesce([S].[NAME], '') as [SEGMENTNAME],
[SS].[ID] as [SEGMENTATIONSEGMENTID],
[SS].[SEQUENCE],
(case when [S].[SEGMENTTYPECODE] = 2 then dbo.[UFN_MKTSEGMENTATIONSEGMENTLIST_GETCOSTPERRECORD2]([SS].[ID], 0) else 0 end) as [COSTPERRECORD],
case [SP].[COSTDISTRIBUTIONMETHODCODE]
when 0 then [SP].[INSERTCOSTPERPIECE]
when 1 then [SP].[INSERTCOSTPERRESPONSE]
when 2 then [SP].[INSERTCOSTPEREFFORT]
when 4 then [SP].[INSERTCOSTPERPIECE]
else 0
end
from dbo.[MKTSEGMENT] [S]
right outer join dbo.[MKTSEGMENTATIONSEGMENT] as [SS] on [S].[ID] = [SS].[SEGMENTID]
inner join dbo.[MKTSEGMENTATIONPACKAGE] as [SP] on ([SP].[PACKAGEID] = [SS].[PACKAGEID] and [SP].[SEGMENTATIONID] = [SS].[SEGMENTATIONID])
inner join dbo.[MKTPACKAGE] as [P] on [P].[ID] = [SS].[PACKAGEID]
where [SS].[SEGMENTATIONID] = @SEGMENTATIONID;
open SEGMENTCURSOR;
fetch next from SEGMENTCURSOR into @PACKAGEID, @PACKAGENAME, @PACKAGECOST, @PACKAGECOSTDISTRIBUTIONMETHODCODE, @SEGMENTID, @SEGMENTNAME, @MAILINGSEGMENTID, @SEQUENCE, @COSTPERRECORD, @INSERTCOST;
while (@@FETCH_STATUS = 0)
begin
delete from @SEGMENTCOUNTS;
insert into @SEGMENTCOUNTS
exec dbo.[USP_MKTSEGMENTATIONSEGMENT_GETRESPONSECOUNTS] @MAILINGSEGMENTID;
select @TOTALOFFERS = @TOTALOFFERS + [OFFERS] from @SEGMENTCOUNTS;
insert into @DATA
select
@MAILINGNAME,
@MAILINGDESCRIPTION,
@MAILINGCODE,
@MAILINGSITE,
@PACKAGEID,
@PACKAGENAME,
@SEGMENTID,
@SEGMENTNAME,
case @PACKAGECOSTDISTRIBUTIONMETHODCODE
when 0 -- per piece
then @PACKAGECOST + @INSERTCOST
when 1 -- per response
then case when [OFFERS] > 0 then (cast(@PACKAGECOST + @INSERTCOST as decimal(20, 10)) * cast([RESPONSES] as decimal(20, 10))) / cast([OFFERS] as decimal(20, 10)) else 0 end
when 4 -- per thousand
then (cast(@PACKAGECOST as decimal(20, 10)) / cast(1000 as decimal(20, 10))) + cast(@INSERTCOST as decimal(20, 10))--INSERTCOST has already been divided by 1000 when we cached it
else 0 end -- per marketing effort (included later), not included in marketing effort cost
+ @COSTPERRECORD as [COSTPERPIECE],
[OFFERS],
[RESPONDERS],
[RESPONSES],
[GIFTAMOUNT],
[AVERAGEGIFTAMOUNT],
@SEQUENCE
from @SEGMENTCOUNTS;
if @PACKAGECOSTDISTRIBUTIONMETHODCODE = 2
set @FIXEDCOST = @FIXEDCOST + isnull(@PACKAGECOST, 0) + isnull(@INSERTCOST, 0);
fetch next from SEGMENTCURSOR into @PACKAGEID, @PACKAGENAME, @PACKAGECOST, @PACKAGECOSTDISTRIBUTIONMETHODCODE, @SEGMENTID, @SEGMENTNAME, @MAILINGSEGMENTID, @SEQUENCE, @COSTPERRECORD, @INSERTCOST;
end;
close SEGMENTCURSOR;
deallocate SEGMENTCURSOR;
/* Calculate the fixed cost per person */
if cast(@TOTALOFFERS as decimal(20, 10)) > 0
set @FIXEDCOSTPERPIECE = cast(@FIXEDCOST as decimal(20, 10)) / cast(@TOTALOFFERS as decimal(20, 10))
select
[MAILINGNAME],
[MAILINGDESCRIPTION],
[MAILINGCODE],
[MAILINGSITE],
[PACKAGEID],
[PACKAGENAME],
[SEGMENTID],
[SEGMENTNAME],
case when ([AVERAGEGIFTAMOUNT] - ([COSTPERPIECE] + @FIXEDCOSTPERPIECE)) <> 0
then [COSTPERPIECE] / ([AVERAGEGIFTAMOUNT] - ([COSTPERPIECE] + @FIXEDCOSTPERPIECE))
else 0 end
as [BREAKEVEN],
case when [OFFERS] <> 0 and ([AVERAGEGIFTAMOUNT] - ([COSTPERPIECE] + @FIXEDCOSTPERPIECE)) <> 0 and [COSTPERPIECE] <> 0
then (
(
(cast([RESPONSES] as decimal(20, 10)) / cast([OFFERS] as decimal(20, 10)))
-
(cast([COSTPERPIECE] as decimal(20, 10)) / cast([AVERAGEGIFTAMOUNT] - ([COSTPERPIECE] + @FIXEDCOSTPERPIECE) as decimal(20, 10)))
)
/
(cast([COSTPERPIECE] as decimal(20, 10)) / cast([AVERAGEGIFTAMOUNT] - ([COSTPERPIECE] + @FIXEDCOSTPERPIECE) as decimal(20, 10)))
) * 100
else 0
end as [BREAKEVENINDEX],
[COSTPERPIECE],
@FIXEDCOSTPERPIECE as [FIXEDCOSTPERPIECE],
[OFFERS],
[RESPONDERS],
[AVERAGEGIFTAMOUNT] as [AVGGIFTAMOUNT],
[SEQUENCE]
from @DATA;
end try
begin catch
exec dbo.[USP_RAISE_ERROR];
return 1;
end catch
return 0;