UFN_MKTSEGMENTATION_GETTOTALLISTSEGMENTCOST
Returns the total cost associated with the use of list segments in a marketing effort.
Return
Return Type |
---|
money |
Parameters
Parameter | Parameter Type | Mode | Description |
---|---|---|---|
@SEGMENTATIONID | uniqueidentifier | IN | |
@SEGMENTID | uniqueidentifier | IN |
Definition
Copy
CREATE function dbo.[UFN_MKTSEGMENTATION_GETTOTALLISTSEGMENTCOST]
(
@SEGMENTATIONID uniqueidentifier,
@SEGMENTID uniqueidentifier = null
)
returns money
as
begin
declare @TOTALLISTCOST money;
set @TOTALLISTCOST = 0;
-- COSTBASIS: 1 = per thousand, 2 = flat
-- this is an ugly sql statement, but this way avoids rounding errors that result
-- from summing UFN_MKTSEGMENTATIONSEGMENTLIST_GETCOSTPERRECORD
-- it looks horrendous, but all it does is, for each list segment:
-- calculate the total (base + adjustment) rental cost, if the rental quantity is > 0,
-- calculate the total (base + adjustment) exchange cost, if the exchange quantity is > 0,
-- add those together
-- this is summed for the mailing
if dbo.[UFN_MKTSEGMENTATION_ISACTIVE](@SEGMENTATIONID) = 0
--For non-activated mailings...
select @TOTALLISTCOST =
isnull(sum(
--Rental costs
(case when (case when isnull([MKTSEGMENTATIONSEGMENTLIST].[OVERRIDEQUANTITIESANDORSEGMENTCOSTS], 0) = 1 then [MKTSEGMENTATIONSEGMENTLIST].[RENTALQUANTITY] else [MKTSEGMENTLIST].[RENTALQUANTITY] end) > 0 then
--Base rental cost
(case when (case when isnull([MKTSEGMENTATIONSEGMENTLIST].[OVERRIDELISTCOSTS], 0) = 1 then [MKTSEGMENTATIONSEGMENTLIST].[BASERENTALCOSTBASISCODE] else [MKTLIST].[BASERENTALCOSTBASISCODE] end) = 1 then --Per thousand
--Base rental cost times rental quantity divided by 1000
(case when isnull([MKTSEGMENTATIONSEGMENTLIST].[OVERRIDELISTCOSTS], 0) = 1 then [MKTSEGMENTATIONSEGMENTLIST].[BASERENTALCOST] else [MKTLIST].[BASERENTALCOST] end) *
((case when isnull([MKTSEGMENTATIONSEGMENTLIST].[OVERRIDEQUANTITIESANDORSEGMENTCOSTS], 0) = 1 then [MKTSEGMENTATIONSEGMENTLIST].[RENTALQUANTITY] else [MKTSEGMENTLIST].[RENTALQUANTITY] end) / cast(1000 as decimal(20,5)))
else
--Base rental cost basis code is flat
(case when isnull([MKTSEGMENTATIONSEGMENTLIST].[OVERRIDELISTCOSTS], 0) = 1 then [MKTSEGMENTATIONSEGMENTLIST].[BASERENTALCOST] else [MKTLIST].[BASERENTALCOST] end)
end)
+
--Rental cost adjustment
(case when (case when isnull([MKTSEGMENTATIONSEGMENTLIST].[OVERRIDEQUANTITIESANDORSEGMENTCOSTS], 0) = 1 then [MKTSEGMENTATIONSEGMENTLIST].[RENTALCOSTADJUSTMENTBASISCODE] else [MKTSEGMENTLIST].[RENTALCOSTBASISCODE] end) = 1 then --Per thousand
--Rental cost adjustment times rental quantity divided by 1000
(case when isnull([MKTSEGMENTATIONSEGMENTLIST].[OVERRIDEQUANTITIESANDORSEGMENTCOSTS], 0) = 1 then [MKTSEGMENTATIONSEGMENTLIST].[RENTALCOSTADJUSTMENT] else [MKTSEGMENTLIST].[RENTALCOSTADJUSTMENT] end) *
((case when isnull([MKTSEGMENTATIONSEGMENTLIST].[OVERRIDEQUANTITIESANDORSEGMENTCOSTS], 0) = 1 then [MKTSEGMENTATIONSEGMENTLIST].[RENTALQUANTITY] else [MKTSEGMENTLIST].[RENTALQUANTITY] end) / cast(1000 as decimal(20,5)))
else
--Rental cost adjustment basis code is flat
(case when isnull([MKTSEGMENTATIONSEGMENTLIST].[OVERRIDEQUANTITIESANDORSEGMENTCOSTS], 0) = 1 then [MKTSEGMENTATIONSEGMENTLIST].[RENTALCOSTADJUSTMENT] else [MKTSEGMENTLIST].[RENTALCOSTADJUSTMENT] end)
end)
else 0 end)
+
--Exchange costs
(case when (case when isnull([MKTSEGMENTATIONSEGMENTLIST].[OVERRIDEQUANTITIESANDORSEGMENTCOSTS], 0) = 1 then [MKTSEGMENTATIONSEGMENTLIST].[EXCHANGEQUANTITY] else [MKTSEGMENTLIST].[EXCHANGEQUANTITY] end) > 0 then
--Base exchange cost
(case when (case when isnull([MKTSEGMENTATIONSEGMENTLIST].[OVERRIDELISTCOSTS], 0) = 1 then [MKTSEGMENTATIONSEGMENTLIST].[BASEEXCHANGECOSTBASISCODE] else [MKTLIST].[BASEEXCHANGECOSTBASISCODE] end) = 1 then --Per thousand
--Base exchange cost times exchange quantity divided by 1000
(case when isnull([MKTSEGMENTATIONSEGMENTLIST].[OVERRIDELISTCOSTS], 0) = 1 then [MKTSEGMENTATIONSEGMENTLIST].[BASEEXCHANGECOST] else [MKTLIST].[BASEEXCHANGECOST] end) *
((case when isnull([MKTSEGMENTATIONSEGMENTLIST].[OVERRIDEQUANTITIESANDORSEGMENTCOSTS], 0) = 1 then [MKTSEGMENTATIONSEGMENTLIST].[EXCHANGEQUANTITY] else [MKTSEGMENTLIST].[EXCHANGEQUANTITY] end) / cast(1000 as decimal(20,5)))
else
--Base exchange cost basis code is flat
(case when isnull([MKTSEGMENTATIONSEGMENTLIST].[OVERRIDELISTCOSTS], 0) = 1 then [MKTSEGMENTATIONSEGMENTLIST].[BASEEXCHANGECOST] else [MKTLIST].[BASEEXCHANGECOST] end)
end)
+
--Exchange cost adjustment
(case when (case when isnull([MKTSEGMENTATIONSEGMENTLIST].[OVERRIDEQUANTITIESANDORSEGMENTCOSTS], 0) = 1 then [MKTSEGMENTATIONSEGMENTLIST].[EXCHANGECOSTADJUSTMENTBASISCODE] else [MKTSEGMENTLIST].[EXCHANGECOSTBASISCODE] end) = 1 then --Per thousand
--Exchange cost adjustment times exchange quantity divided by 1000
(case when isnull([MKTSEGMENTATIONSEGMENTLIST].[OVERRIDEQUANTITIESANDORSEGMENTCOSTS], 0) = 1 then [MKTSEGMENTATIONSEGMENTLIST].[EXCHANGECOSTADJUSTMENT] else [MKTSEGMENTLIST].[EXCHANGECOSTADJUSTMENT] end) *
((case when isnull([MKTSEGMENTATIONSEGMENTLIST].[OVERRIDEQUANTITIESANDORSEGMENTCOSTS], 0) = 1 then [MKTSEGMENTATIONSEGMENTLIST].[EXCHANGEQUANTITY] else [MKTSEGMENTLIST].[EXCHANGEQUANTITY] end) / cast(1000 as decimal(20,5)))
else
--Exchange cost adjustment basis code is flat
(case when isnull([MKTSEGMENTATIONSEGMENTLIST].[OVERRIDEQUANTITIESANDORSEGMENTCOSTS], 0) = 1 then [MKTSEGMENTATIONSEGMENTLIST].[EXCHANGECOSTADJUSTMENT] else [MKTSEGMENTLIST].[EXCHANGECOSTADJUSTMENT] end)
end)
else 0 end)
), 0)
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]
left join dbo.[MKTSEGMENTATIONSEGMENTLIST] on [MKTSEGMENTATIONSEGMENTLIST].[ID] = [MKTSEGMENTATIONSEGMENT].[ID]
where [MKTSEGMENTATIONSEGMENT].[SEGMENTATIONID] = @SEGMENTATIONID
and (@SEGMENTID is null or [MKTSEGMENTATIONSEGMENT].[ID] = @SEGMENTID);
else
select @TOTALLISTCOST =
isnull(sum(
--Rental costs
(case when [MKTSEGMENTATIONSEGMENTLIST].[RENTALQUANTITY] > 0 then
--Base rental cost
(case when [MKTSEGMENTATIONSEGMENTLIST].[BASERENTALCOSTBASISCODE] = 1 then --Per thousand
[MKTSEGMENTATIONSEGMENTLIST].[BASERENTALCOST] * ([MKTSEGMENTATIONSEGMENTLIST].[RENTALQUANTITY] / cast(1000 as decimal(20,5)))
else
[MKTSEGMENTATIONSEGMENTLIST].[BASERENTALCOST]
end)
+
--Rental cost adjustment
(case when [MKTSEGMENTATIONSEGMENTLIST].[RENTALCOSTADJUSTMENTBASISCODE] = 1 then --Per thousand
[MKTSEGMENTATIONSEGMENTLIST].[RENTALCOSTADJUSTMENT] * ([MKTSEGMENTATIONSEGMENTLIST].[RENTALQUANTITY] / cast(1000 as decimal(20,5)))
else
[MKTSEGMENTATIONSEGMENTLIST].[RENTALCOSTADJUSTMENT]
end)
else 0 end)
+
--Exchange costs
(case when [MKTSEGMENTATIONSEGMENTLIST].[EXCHANGEQUANTITY] > 0 then
--Base exchange cost
(case when [MKTSEGMENTATIONSEGMENTLIST].[BASEEXCHANGECOSTBASISCODE] = 1 then --Per thousand
[MKTSEGMENTATIONSEGMENTLIST].[BASEEXCHANGECOST] * ([MKTSEGMENTATIONSEGMENTLIST].[EXCHANGEQUANTITY] / cast(1000 as decimal(20,5)))
else
[MKTSEGMENTATIONSEGMENTLIST].[BASEEXCHANGECOST]
end)
+
--Exchange cost adjustment
(case when [MKTSEGMENTATIONSEGMENTLIST].[EXCHANGECOSTADJUSTMENTBASISCODE] = 1 then --Per thousand
[MKTSEGMENTATIONSEGMENTLIST].[EXCHANGECOSTADJUSTMENT] * ([MKTSEGMENTATIONSEGMENTLIST].[EXCHANGEQUANTITY] / cast(1000 as decimal(20,5)))
else
[MKTSEGMENTATIONSEGMENTLIST].[EXCHANGECOSTADJUSTMENT]
end)
else 0 end)
), 0)
from dbo.[MKTSEGMENTATIONSEGMENT]
inner join dbo.[MKTSEGMENTATIONSEGMENTLIST] on [MKTSEGMENTATIONSEGMENTLIST].[ID] = [MKTSEGMENTATIONSEGMENT].[ID]
inner join dbo.[MKTSEGMENTLIST] on [MKTSEGMENTLIST].[ID] = [MKTSEGMENTATIONSEGMENTLIST].[SEGMENTLISTID]
where [MKTSEGMENTATIONSEGMENT].[SEGMENTATIONID] = @SEGMENTATIONID
and (@SEGMENTID is null or [MKTSEGMENTATIONSEGMENT].[ID] = @SEGMENTID);
return @TOTALLISTCOST;
end