UFN_MKTSEGMENTATIONSEGMENTLIST_GETCOSTPERRECORD2
Returns the cost per record, in organization or base currency, for a marketing effort's list segment.
Return
Return Type |
---|
numeric(30, 20) |
Parameters
Parameter | Parameter Type | Mode | Description |
---|---|---|---|
@ID | uniqueidentifier | IN | |
@CURRENCYCODE | tinyint | IN |
Definition
Copy
CREATE function dbo.[UFN_MKTSEGMENTATIONSEGMENTLIST_GETCOSTPERRECORD2]
(
@ID uniqueidentifier,
@CURRENCYCODE tinyint -- 0 = base, 1 = organization
)
-- return a large number of decimal places, rather than a money data type, to
-- minimize rounding errors that accumulate when expenses are summed
returns numeric(30, 20)
as begin
declare @SEGMENTATIONID uniqueidentifier;
declare @LISTID uniqueidentifier;
declare @OVERRIDEQUANTITIESANDORSEGMENTCOSTS bit;
declare @OVERRIDELISTCOSTS bit;
declare @BASERENTALCOST money;
declare @BASERENTALCOSTBASISCODE tinyint; -- 1 = per thousand, 2 = flat
declare @TOTALRENTALQUANTITY integer;
declare @BASERENTALCOSTPERRECORD numeric(30, 20);
declare @TOTALEXCHANGEQUANTITY integer;
declare @BASEEXCHANGECOSTPERRECORD numeric(30, 20);
declare @RENTALQUANTITY integer;
declare @RENTALCOSTADJUSTMENT money;
declare @RENTALCOSTADJUSTMENTBASISCODE tinyint; --1 = per thousand, 2 = flat
declare @SEGMENTRENTALCOST numeric(30, 20);
declare @BASEEXCHANGECOST money;
declare @BASEEXCHANGECOSTBASISCODE tinyint; -- 1 = per thousand, 2 = flat
declare @EXCHANGEQUANTITY integer;
declare @EXCHANGECOSTADJUSTMENT money;
declare @EXCHANGECOSTADJUSTMENTBASISCODE tinyint; -- 1 = per thousand, 2 = flat
declare @SEGMENTEXCHANGECOST numeric(30, 20);
declare @COSTPERRECORD numeric(30, 20);
declare @ORGANIZATIONBASERENTALCOST money;
declare @ORGANIZATIONBASERENTALCOSTPERRECORD numeric(30, 20);
declare @ORGANIZATIONBASEEXCHANGECOSTPERRECORD numeric(30, 20);
declare @ORGANIZATIONRENTALCOSTADJUSTMENT money;
declare @ORGANIZATIONSEGMENTRENTALCOST numeric(30, 20);
declare @ORGANIZATIONBASEEXCHANGECOST money;
declare @ORGANIZATIONEXCHANGECOSTADJUSTMENT money;
declare @ORGANIZATIONSEGMENTEXCHANGECOST numeric(30, 20);
set @COSTPERRECORD = 0;
select
@LISTID = [MKTSEGMENTLIST].[LISTID],
@OVERRIDEQUANTITIESANDORSEGMENTCOSTS = (case when ([MKTSEGMENTATION].[ACTIVE] = 1 or isnull([MKTSEGMENTATIONSEGMENTLIST].[OVERRIDEQUANTITIESANDORSEGMENTCOSTS], 0) = 1) then 1 else 0 end),
@OVERRIDELISTCOSTS = (case when ([MKTSEGMENTATION].[ACTIVE] = 1 or isnull([MKTSEGMENTATIONSEGMENTLIST].[OVERRIDELISTCOSTS], 0) = 1) then 1 else 0 end)
from dbo.[MKTSEGMENTATIONSEGMENT]
inner join dbo.[MKTSEGMENTATION] on [MKTSEGMENTATION].[ID] = [MKTSEGMENTATIONSEGMENT].[SEGMENTATIONID]
inner join dbo.[MKTSEGMENT] on [MKTSEGMENT].[ID] = [MKTSEGMENTATIONSEGMENT].[SEGMENTID]
inner join dbo.[MKTSEGMENTLIST] on [MKTSEGMENTLIST].[ID] = [MKTSEGMENT].[CURRENTSEGMENTLISTID]
left join dbo.[MKTSEGMENTATIONSEGMENTLIST] on [MKTSEGMENTATIONSEGMENTLIST].[ID] = [MKTSEGMENTATIONSEGMENT].[ID]
where [MKTSEGMENTATIONSEGMENT].[ID] = @ID;
if @OVERRIDEQUANTITIESANDORSEGMENTCOSTS = 1
select
@RENTALQUANTITY = [RENTALQUANTITY],
@RENTALCOSTADJUSTMENT = [RENTALCOSTADJUSTMENT],
@RENTALCOSTADJUSTMENTBASISCODE = [RENTALCOSTADJUSTMENTBASISCODE],
@EXCHANGEQUANTITY = [EXCHANGEQUANTITY],
@EXCHANGECOSTADJUSTMENT = [EXCHANGECOSTADJUSTMENT],
@EXCHANGECOSTADJUSTMENTBASISCODE = [EXCHANGECOSTADJUSTMENTBASISCODE],
@ORGANIZATIONRENTALCOSTADJUSTMENT = [ORGANIZATIONRENTALCOSTADJUSTMENT],
@ORGANIZATIONEXCHANGECOSTADJUSTMENT = [ORGANIZATIONEXCHANGECOSTADJUSTMENT]
from dbo.[MKTSEGMENTATIONSEGMENTLIST]
where [ID] = @ID
else
select
@RENTALQUANTITY = [MKTSEGMENTLIST].[RENTALQUANTITY],
@RENTALCOSTADJUSTMENT = [MKTSEGMENTLIST].[RENTALCOSTADJUSTMENT],
@RENTALCOSTADJUSTMENTBASISCODE = [MKTSEGMENTLIST].[RENTALCOSTBASISCODE],
@EXCHANGEQUANTITY = [MKTSEGMENTLIST].[EXCHANGEQUANTITY],
@EXCHANGECOSTADJUSTMENT = [MKTSEGMENTLIST].[EXCHANGECOSTADJUSTMENT],
@EXCHANGECOSTADJUSTMENTBASISCODE = [MKTSEGMENTLIST].[EXCHANGECOSTBASISCODE],
@ORGANIZATIONRENTALCOSTADJUSTMENT = [MKTSEGMENTLIST].[ORGANIZATIONRENTALCOSTADJUSTMENT],
@ORGANIZATIONEXCHANGECOSTADJUSTMENT = [MKTSEGMENTLIST].[ORGANIZATIONEXCHANGECOSTADJUSTMENT]
from dbo.[MKTSEGMENTATIONSEGMENT]
inner join dbo.[MKTSEGMENT] on [MKTSEGMENT].[ID] = [MKTSEGMENTATIONSEGMENT].[SEGMENTID]
inner join dbo.[MKTSEGMENTLIST] on [MKTSEGMENTLIST].[ID] = [MKTSEGMENT].[CURRENTSEGMENTLISTID]
where [MKTSEGMENTATIONSEGMENT].[ID] = @ID;
if (@RENTALQUANTITY + @EXCHANGEQUANTITY) > 0
begin
if @OVERRIDELISTCOSTS = 1
select
@SEGMENTATIONID = [MKTSEGMENTATIONSEGMENT].[SEGMENTATIONID],
@BASERENTALCOST = [MKTSEGMENTATIONSEGMENTLIST].[BASERENTALCOST],
@BASERENTALCOSTBASISCODE = [MKTSEGMENTATIONSEGMENTLIST].[BASERENTALCOSTBASISCODE],
@BASEEXCHANGECOST = [MKTSEGMENTATIONSEGMENTLIST].[BASEEXCHANGECOST],
@BASEEXCHANGECOSTBASISCODE = [MKTSEGMENTATIONSEGMENTLIST].[BASEEXCHANGECOSTBASISCODE],
@ORGANIZATIONBASERENTALCOST = [MKTSEGMENTATIONSEGMENTLIST].[ORGANIZATIONBASERENTALCOST],
@ORGANIZATIONBASEEXCHANGECOST = [MKTSEGMENTATIONSEGMENTLIST].[ORGANIZATIONBASEEXCHANGECOST]
from dbo.[MKTSEGMENTATIONSEGMENT]
inner join dbo.[MKTSEGMENTATIONSEGMENTLIST] on [MKTSEGMENTATIONSEGMENTLIST].[ID] = [MKTSEGMENTATIONSEGMENT].[ID]
where [MKTSEGMENTATIONSEGMENT].[ID] = @ID
else
select
@SEGMENTATIONID = [MKTSEGMENTATIONSEGMENT].[SEGMENTATIONID],
@BASERENTALCOST = [MKTLIST].[BASERENTALCOST],
@BASERENTALCOSTBASISCODE = [MKTLIST].[BASERENTALCOSTBASISCODE],
@BASEEXCHANGECOST = [MKTLIST].[BASEEXCHANGECOST],
@BASEEXCHANGECOSTBASISCODE = [MKTLIST].[BASEEXCHANGECOSTBASISCODE],
@ORGANIZATIONBASERENTALCOST = [MKTLIST].[ORGANIZATIONBASERENTALCOST],
@ORGANIZATIONBASEEXCHANGECOST = [MKTLIST].[ORGANIZATIONBASEEXCHANGECOST]
from dbo.[MKTSEGMENTATIONSEGMENT]
inner join dbo.[MKTSEGMENT] on [MKTSEGMENT].[ID] = [MKTSEGMENTATIONSEGMENT].[SEGMENTID]
inner join dbo.[MKTSEGMENTLIST] on [MKTSEGMENTLIST].[ID] = [MKTSEGMENT].[CURRENTSEGMENTLISTID]
inner join dbo.[MKTLIST] on [MKTLIST].[ID] = [MKTSEGMENTLIST].[LISTID]
where [MKTSEGMENTATIONSEGMENT].[ID] = @ID;
set @BASERENTALCOSTPERRECORD = 0;
set @BASEEXCHANGECOSTPERRECORD = 0;
set @SEGMENTRENTALCOST = 0;
set @SEGMENTEXCHANGECOST = 0;
set @ORGANIZATIONBASERENTALCOSTPERRECORD = 0;
set @ORGANIZATIONBASEEXCHANGECOSTPERRECORD = 0;
set @ORGANIZATIONSEGMENTRENTALCOST = 0;
set @ORGANIZATIONSEGMENTEXCHANGECOST = 0;
if @RENTALQUANTITY > 0
begin
if @BASERENTALCOSTBASISCODE = 1
begin
-- divide the cost by 1000
set @BASERENTALCOSTPERRECORD = convert(numeric(30, 20), @BASERENTALCOST) / 1000;
set @ORGANIZATIONBASERENTALCOSTPERRECORD = convert(numeric(30, 20), @ORGANIZATIONBASERENTALCOST) / 1000;
end
else -- 2 = flat
begin
-- divide the cost by the number of rental records for this list in the entire mailing
select
@TOTALRENTALQUANTITY = isnull(sum(case when @OVERRIDEQUANTITIESANDORSEGMENTCOSTS = 1 then [MKTSEGMENTATIONSEGMENTLIST].[RENTALQUANTITY] else [MKTSEGMENTLIST].[RENTALQUANTITY] end), 0)
from dbo.[MKTSEGMENTATIONSEGMENT]
inner join dbo.[MKTSEGMENT] on [MKTSEGMENT].[ID] = [MKTSEGMENTATIONSEGMENT].[SEGMENTID]
inner join dbo.[MKTSEGMENTLIST] on [MKTSEGMENTLIST].[ID] = [MKTSEGMENT].[CURRENTSEGMENTLISTID]
left join dbo.[MKTSEGMENTATIONSEGMENTLIST] on [MKTSEGMENTATIONSEGMENTLIST].[ID] = [MKTSEGMENTATIONSEGMENT].[ID]
where [MKTSEGMENTATIONSEGMENT].[SEGMENTATIONID] = @SEGMENTATIONID
and [MKTSEGMENTLIST].[LISTID] = @LISTID;
-- don't need to check for division by zero because total is going to include @RENTALQUANTITY, which is > 0
set @BASERENTALCOSTPERRECORD = convert(numeric(30, 20), @BASERENTALCOST) / @TOTALRENTALQUANTITY;
set @ORGANIZATIONBASERENTALCOSTPERRECORD = convert(numeric(30, 20), @ORGANIZATIONBASERENTALCOST) / @TOTALRENTALQUANTITY;
end
if @RENTALCOSTADJUSTMENTBASISCODE = 1 -- per thousand
begin
set @SEGMENTRENTALCOST = convert(numeric(30, 20), @RENTALCOSTADJUSTMENT) * (convert(numeric(30, 20), @RENTALQUANTITY) / 1000);
set @ORGANIZATIONSEGMENTRENTALCOST = convert(numeric(30, 20), @ORGANIZATIONRENTALCOSTADJUSTMENT) * (convert(numeric(30, 20), @RENTALQUANTITY) / 1000);
end
else
begin
set @SEGMENTRENTALCOST = convert(numeric(30, 20), @RENTALCOSTADJUSTMENT);
set @ORGANIZATIONSEGMENTRENTALCOST = convert(numeric(30, 20), @ORGANIZATIONRENTALCOSTADJUSTMENT);
end
end
if @EXCHANGEQUANTITY > 0
begin
if @BASEEXCHANGECOSTBASISCODE = 1
begin
-- divide the cost by 1000
set @BASEEXCHANGECOSTPERRECORD = @BASEEXCHANGECOST / 1000;
set @ORGANIZATIONBASEEXCHANGECOSTPERRECORD = @ORGANIZATIONBASEEXCHANGECOST / 1000;
end
else -- 2 = flat
-- divide the cost by the number of exchange records for this list in the entire mailing
begin
select
@TOTALEXCHANGEQUANTITY = isnull(sum(case when @OVERRIDEQUANTITIESANDORSEGMENTCOSTS = 1 then [MKTSEGMENTATIONSEGMENTLIST].[EXCHANGEQUANTITY] else [MKTSEGMENTLIST].[EXCHANGEQUANTITY] end), 0)
from dbo.[MKTSEGMENTATIONSEGMENT]
inner join dbo.[MKTSEGMENT] on [MKTSEGMENT].[ID] = [MKTSEGMENTATIONSEGMENT].[SEGMENTID]
inner join dbo.[MKTSEGMENTLIST] on [MKTSEGMENTLIST].[ID] = [MKTSEGMENT].[CURRENTSEGMENTLISTID]
left join dbo.[MKTSEGMENTATIONSEGMENTLIST] on [MKTSEGMENTATIONSEGMENTLIST].[ID] = [MKTSEGMENTATIONSEGMENT].[ID]
where [MKTSEGMENTATIONSEGMENT].[SEGMENTATIONID] = @SEGMENTATIONID
and [MKTSEGMENTLIST].[LISTID] = @LISTID;
-- don't need to check for division by zero because total is going to include @EXCHANGEQUANTITY, which is > 0
set @BASEEXCHANGECOSTPERRECORD = @BASEEXCHANGECOST / @TOTALEXCHANGEQUANTITY;
set @ORGANIZATIONBASEEXCHANGECOSTPERRECORD = @ORGANIZATIONBASEEXCHANGECOST / @TOTALEXCHANGEQUANTITY;
end
if @EXCHANGECOSTADJUSTMENTBASISCODE = 1 -- per thousand
begin
set @SEGMENTEXCHANGECOST = convert(numeric(30, 20), @EXCHANGECOSTADJUSTMENT) * (convert(numeric(30, 20), @EXCHANGEQUANTITY) / 1000);
set @ORGANIZATIONSEGMENTEXCHANGECOST = convert(numeric(30, 20), @ORGANIZATIONEXCHANGECOSTADJUSTMENT) * (convert(numeric(30, 20), @EXCHANGEQUANTITY) / 1000);
end
else
begin
set @SEGMENTEXCHANGECOST = convert(numeric(30, 20), @EXCHANGECOSTADJUSTMENT);
set @ORGANIZATIONSEGMENTEXCHANGECOST = convert(numeric(30, 20), @ORGANIZATIONEXCHANGECOSTADJUSTMENT);
end
end
-- base cost + additional cost of the segment, averaged across the total number of records in the segment
if @CURRENCYCODE = 1
set @COSTPERRECORD = (((@ORGANIZATIONBASERENTALCOSTPERRECORD * @RENTALQUANTITY) + (@ORGANIZATIONBASEEXCHANGECOSTPERRECORD * @EXCHANGEQUANTITY) + @ORGANIZATIONSEGMENTRENTALCOST + @ORGANIZATIONSEGMENTEXCHANGECOST) / (@RENTALQUANTITY + @EXCHANGEQUANTITY));
else
set @COSTPERRECORD = (((@BASERENTALCOSTPERRECORD * @RENTALQUANTITY) + (@BASEEXCHANGECOSTPERRECORD * @EXCHANGEQUANTITY) + @SEGMENTRENTALCOST + @SEGMENTEXCHANGECOST) / (@RENTALQUANTITY + @EXCHANGEQUANTITY));
end
return @COSTPERRECORD;
end