gilweber3
asked on
slow Stored Procedure
guys, I have a stored procedure that is part of a job that usually takes 30 mins to run tops. The last couple of nights that job has exploded to 6 hours. I currently have the job running in SQL and I confirmed that all the tables have data. We are truncating and inserting into the table. Not sure what is the best way to troubleshoot this one.
I also ran the code without the insert into and truncate ( just included the declares) and I got some data back ( I just ran it for a few minutes to make sure I was getting at least some data back.
any ideas on where to start?
I also ran the code without the insert into and truncate ( just included the declares) and I got some data back ( I just ran it for a few minutes to make sure I was getting at least some data back.
any ideas on where to start?
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER
the table does in fact have indexes, what is the easiest way to drop these and insert these back via sql ? To give a little more background this SP run time went from 30 minutes to 6 hours in the last couple of days. It seems to be imtermitten with no real probably cause ( but I am not DBA)
Can you run the select query alone on a new query window and let me know how long its gonna take it to return the data. seems like your actual query has to be tuned up
ASKER
I am running it now.
ASKER
The query itself is running slowly, regardless of the insert. We took the insert out.
ASKER
notice that we are using a lot of functions, should we be using update statements? well we are calling 2 distinct functions 50 times for each record. Is there a more efficient way to deal with this?
>Is there a more efficient way to deal with this?
You can paste those functions here, we will try to optimize them.
user defined functions are slower as the execution plans are not stored in the memory, if you have alternative ways of doing it, you need to try them
You can paste those functions here, we will try to optimize them.
user defined functions are slower as the execution plans are not stored in the memory, if you have alternative ways of doing it, you need to try them
ASKER
DECLARE @ResultVal nvarchar(200)
SET @ResultVal =
CASE WHEN @DB = 'Monthly' THEN
(SELECT ISNULL( ( SELECT enum.pia_val
FROM ERM_MONTHLY.dbo.PIA_ENUMUR ATION enum
WHERE enum.attribute_enumuration _id = prod_pia.attribute_enumura tion_id ), prod_pia.pia_val
)
FROM ERM_MONTHLY.dbo.DEAL_PRODU CT_PIA prod_pia
WHERE prod_pia.deal_product_id = @deal_product_id AND
prod_pia.action_id = @action_id AND
prod_pia.pia_id = @pia_id)
WHEN @DB = 'Weekly' THEN
(SELECT ISNULL( ( SELECT enum.pia_val
FROM ERM_WEEKLY.dbo.PIA_ENUMURA TION enum
WHERE enum.attribute_enumuration _id = prod_pia.attribute_enumura tion_id ), prod_pia.pia_val
)
FROM ERM_WEEKLY.dbo.DEAL_PRODUC T_PIA prod_pia
WHERE prod_pia.deal_product_id = @deal_product_id AND
prod_pia.action_id = @action_id AND
prod_pia.pia_id = @pia_id)
WHEN @DB = 'Daily' THEN
(SELECT ISNULL( ( SELECT enum.pia_val
FROM ERM.dbo.PIA_ENUMURATION enum
WHERE enum.attribute_enumuration _id = prod_pia.attribute_enumura tion_id ), prod_pia.pia_val
)
FROM ERM.dbo.DEAL_PRODUCT_PIA prod_pia
WHERE prod_pia.deal_product_id = @deal_product_id AND
prod_pia.action_id = @action_id AND
prod_pia.pia_id = @pia_id)
SET @ResultVal =
CASE WHEN @DB = 'Monthly' THEN
(SELECT ISNULL( ( SELECT enum.pia_val
FROM ERM_MONTHLY.dbo.PIA_ENUMUR
WHERE enum.attribute_enumuration
)
FROM ERM_MONTHLY.dbo.DEAL_PRODU
WHERE prod_pia.deal_product_id = @deal_product_id AND
prod_pia.action_id = @action_id AND
prod_pia.pia_id = @pia_id)
WHEN @DB = 'Weekly' THEN
(SELECT ISNULL( ( SELECT enum.pia_val
FROM ERM_WEEKLY.dbo.PIA_ENUMURA
WHERE enum.attribute_enumuration
)
FROM ERM_WEEKLY.dbo.DEAL_PRODUC
WHERE prod_pia.deal_product_id = @deal_product_id AND
prod_pia.action_id = @action_id AND
prod_pia.pia_id = @pia_id)
WHEN @DB = 'Daily' THEN
(SELECT ISNULL( ( SELECT enum.pia_val
FROM ERM.dbo.PIA_ENUMURATION enum
WHERE enum.attribute_enumuration
)
FROM ERM.dbo.DEAL_PRODUCT_PIA prod_pia
WHERE prod_pia.deal_product_id = @deal_product_id AND
prod_pia.action_id = @action_id AND
prod_pia.pia_id = @pia_id)
ASKER
DECLARE @ResultVal numeric(16,3)
SET @ResultVal =
CASE WHEN @DB = 'Monthly'THEN
( SELECT fee.fee_amount
FROM ERM_MONTHLY.dbo.DEAL_PRODU CT_SUBPROD UCT_FEE fee
WHERE fee.deal_product_id = @deal_product_id AND
fee.sub_product_id = @Fee_Id
)
WHEN @DB = 'Weekly' THEN
( SELECT fee.fee_amount
FROM ERM_WEEKLY.dbo.DEAL_PRODUC T_SUBPRODU CT_FEE fee
WHERE fee.deal_product_id = @deal_product_id AND
fee.sub_product_id = @Fee_Id
)
WHEN @DB = 'Daily' THEN
( SELECT fee.fee_amount
FROM ERM.dbo.DEAL_PRODUCT_SUBPR ODUCT_FEE fee
WHERE fee.deal_product_id = @deal_product_id AND
fee.sub_product_id = @Fee_Id
)
END -- End Case Statement
RETURN @ResultVal
SET @ResultVal =
CASE WHEN @DB = 'Monthly'THEN
( SELECT fee.fee_amount
FROM ERM_MONTHLY.dbo.DEAL_PRODU
WHERE fee.deal_product_id = @deal_product_id AND
fee.sub_product_id = @Fee_Id
)
WHEN @DB = 'Weekly' THEN
( SELECT fee.fee_amount
FROM ERM_WEEKLY.dbo.DEAL_PRODUC
WHERE fee.deal_product_id = @deal_product_id AND
fee.sub_product_id = @Fee_Id
)
WHEN @DB = 'Daily' THEN
( SELECT fee.fee_amount
FROM ERM.dbo.DEAL_PRODUCT_SUBPR
WHERE fee.deal_product_id = @deal_product_id AND
fee.sub_product_id = @Fee_Id
)
END -- End Case Statement
RETURN @ResultVal
ASKER
both functions are posted here, yes we are in agreement that because the execution plans are not stored that this is a problem. It is a a little strange that this is just happening now when it was fine before . Maybe we hit a tipping point so to speak.
Maybe we hit a tipping point so to speak.
That is exactly what has happened.
Here is what you should do.
1. Make sure the stats are updated for all tables involved.
2. Defrag all indexes.
3. Make sure you have appropriate indexes on all the tables (if you are not sure we can elaborate)
4. If you are still getting lousy performance, consider executing in batches.
That is exactly what has happened.
Here is what you should do.
1. Make sure the stats are updated for all tables involved.
2. Defrag all indexes.
3. Make sure you have appropriate indexes on all the tables (if you are not sure we can elaborate)
4. If you are still getting lousy performance, consider executing in batches.
I think a CROSS APPLY could help performance tremendously here.
I don't have time to write out every lookup value -- you'll have to add the others yourself -- but hopefully you can get the gist of my approach from below.
The same thing can (and in my view probably should) be done for the ERMProductFees:
SELECT ...,
-- get all PIA details for each product
...
ERMPIAValues.'pia_2nd_Lien ?',
ERMPIAValues.'pia_Account_ Number',
ERMPIAValues.'pia_Actual_I nterest_Ra te',
ERMPIAValues.'pia_Adj_Vari able_Contr ibution',
/************************* ********** ********** ********** */
/* Use Actual_Interest_Rate from ePF. It accounts for */
/* all ePF logic. If NULL then use what has been typed */
/* into ERM. */
/************************* ********** ********** ********** */
ISNULL(ERMPIAValues.'pia_A ctual_Inte rest_Rate' , ERMPIAValues.'pia_All_In_R ate') AS 'pia_All_In_Rate',
ERMPIAValues.'pia_All_In_R ate_Daily' AS 'pia_All_In_Rate_In_ERM',
...
FROM
INNER JOIN ...
...
CROSS APPLY (
SELECT
MAX(CASE WHEN prod_pia.pia_id = 1 THEN CONVERT(bit, ISNULL(enum.pia_val, prod_pia.pia_val)) END)
AS 'pia_2nd_Lien?',
MAX(CASE WHEN prod_pia.pia_id = 18 THEN CONVERT(numeric (19, 6), ISNULL(enum.pia_val, prod_pia.pia_val)) END)
AS 'pia_Adj_Variable_Contribu tion',
MAX(CASE WHEN prod_pia.pia_id = 20 THEN CONVERT(numeric (9, 5), ISNULL(enum.pia_val, prod_pia.pia_val)) END)
AS 'pia_All_In_Rate',
MAX(CASE WHEN prod_pia.pia_id = 24 THEN CONVERT(varchar(100), ISNULL(enum.pia_val, prod_pia.pia_val)) END)
AS 'pia_Account_Number',
MAX(CASE WHEN prod_pia.pia_id = 27 THEN CONVERT(numeric (19, 6), ISNULL(enum.pia_val, prod_pia.pia_val)) END)
AS 'pia_Assets',
MAX(CASE WHEN prod_pia.pia_id = 59 THEN CONVERT(numeric(9,5), ISNULL(enum.pia_val, prod_pia.pia_val)) END)
AS 'pia_Actual_Interest_Rate' ,
MAX(CASE WHEN prod_pia.pia_id = 77 THEN CONVERT(varchar(100), ISNULL(enum.pia_val, prod_pia.pia_val)) END)
AS 'pia_Auto_Line_Type'
FROM ERM.dbo.DEAL_PRODUCT_PIA prod_pia
LEFT OUTER JOIN ERM.dbo.PIA_ENUMURATION enum ON
enum.attribute_enumuration _id = prod_pia.attribute_enumura tion_id
WHERE
prod_pia.deal_product_id = prod.deal_product_id AND
prod_pia.action_id = prod.action_id
) AS ERMPIAValues
I don't have time to write out every lookup value -- you'll have to add the others yourself -- but hopefully you can get the gist of my approach from below.
The same thing can (and in my view probably should) be done for the ERMProductFees:
SELECT ...,
-- get all PIA details for each product
...
ERMPIAValues.'pia_2nd_Lien
ERMPIAValues.'pia_Account_
ERMPIAValues.'pia_Actual_I
ERMPIAValues.'pia_Adj_Vari
/*************************
/* Use Actual_Interest_Rate from ePF. It accounts for */
/* all ePF logic. If NULL then use what has been typed */
/* into ERM. */
/*************************
ISNULL(ERMPIAValues.'pia_A
ERMPIAValues.'pia_All_In_R
...
FROM
INNER JOIN ...
...
CROSS APPLY (
SELECT
MAX(CASE WHEN prod_pia.pia_id = 1 THEN CONVERT(bit, ISNULL(enum.pia_val, prod_pia.pia_val)) END)
AS 'pia_2nd_Lien?',
MAX(CASE WHEN prod_pia.pia_id = 18 THEN CONVERT(numeric (19, 6), ISNULL(enum.pia_val, prod_pia.pia_val)) END)
AS 'pia_Adj_Variable_Contribu
MAX(CASE WHEN prod_pia.pia_id = 20 THEN CONVERT(numeric (9, 5), ISNULL(enum.pia_val, prod_pia.pia_val)) END)
AS 'pia_All_In_Rate',
MAX(CASE WHEN prod_pia.pia_id = 24 THEN CONVERT(varchar(100), ISNULL(enum.pia_val, prod_pia.pia_val)) END)
AS 'pia_Account_Number',
MAX(CASE WHEN prod_pia.pia_id = 27 THEN CONVERT(numeric (19, 6), ISNULL(enum.pia_val, prod_pia.pia_val)) END)
AS 'pia_Assets',
MAX(CASE WHEN prod_pia.pia_id = 59 THEN CONVERT(numeric(9,5), ISNULL(enum.pia_val, prod_pia.pia_val)) END)
AS 'pia_Actual_Interest_Rate'
MAX(CASE WHEN prod_pia.pia_id = 77 THEN CONVERT(varchar(100), ISNULL(enum.pia_val, prod_pia.pia_val)) END)
AS 'pia_Auto_Line_Type'
FROM ERM.dbo.DEAL_PRODUCT_PIA prod_pia
LEFT OUTER JOIN ERM.dbo.PIA_ENUMURATION enum ON
enum.attribute_enumuration
WHERE
prod_pia.deal_product_id = prod.deal_product_id AND
prod_pia.action_id = prod.action_id
) AS ERMPIAValues
ASKER
-- Set a rolling start of ten years from the bigging of current year
DECLARE @RollingStartDate datetime
SET @RollingStartDate = DATEADD(yy, -6, dbo.fn_StartDate(getdate()
INSERT INTO dbo.CDS_ts_ERMD_Sales_Deta
SELECT profdet.ERM_PN,
profdet.ERM_PN_Name,
profdet.[ERM_PN_Customer/P
profdet.ERM_Primary_Office
so.opportunity_id,
so.sales_opportunity_name,
so.campaign_id,
camp.campaign_name,
deal.deal_id,
prodfam.product_family_nam
prod.deal_product_id,
proditm.product_family_id,
proditm.product_family_nam
prod.product_id,
proditm.product_item_name,
prod.action_id,
actn.action_name,
prod.dispose_date,
prod.sales_cycle_stage_id,
prod.disposition_status_fl
disprsn.disposition_reason
awrdcomp.awarded_company_n
prod.product_locked_flag,
prod.override_modified_by,
prod.override_modified_dat
prod.to_clas_profile_id, -- profile product is for and which is used in CLAS
prod.product_in_clas,
-- get all PIA details for each product
CONVERT(Bit ,dbo.fn_ERMPIAValue(prod.d
CONVERT(Varchar (100) ,dbo.fn_ERMPIAValue(prod.d
CONVERT(Numeric (19,6) ,dbo.fn_ERMPIAValue(prod.d
CONVERT(Numeric (19, 6) ,dbo.fn_ERMPIAValue(prod.d
/*************************
/* Use Actual_Interest_Rate from ePF. It accounts for */
/* all ePF logic. If NULL then use what has been typed */
/* into ERM. */
/*************************
CONVERT(numeric(9,5), ISNULL(dbo.fn_ERMPIAValue(
CONVERT(numeric(9,5), dbo.fn_ERMPIAValue(prod.de
CONVERT(Numeric (19, 6) ,dbo.fn_ERMPIAValue(prod.d
CONVERT(Varchar (100) ,dbo.fn_ERMPIAValue(prod.d
CONVERT(Bit ,dbo.fn_ERMPIAValue(prod.d
CONVERT(Numeric (19, 6) ,dbo.fn_ERMPIAValue(prod.d
CONVERT(Numeric (19, 6) ,dbo.fn_ERMPIAValue(prod.d
CONVERT(Numeric (19, 6) ,dbo.fn_ERMPIAValue(prod.d
-- Adding Commercial Division verions of Outstandings for analysis purposes
-- Adjusts for short Term, negative values, Construction Loans and Term Loans
CONVERT(Numeric (19, 6), [Commercial_Segment_Report
CONVERT(Numeric (19, 6) ,dbo.fn_ERMPIAValue(prod.d
CONVERT(Varchar (100) ,dbo.fn_ERMPIAValue(prod.d
CONVERT(Int ,dbo.fn_ERMPIAValue(prod.d
CONVERT(Numeric (19,6) ,dbo.fn_ERMPIAValue(prod.d
CONVERT(Numeric (19, 6) ,dbo.fn_ERMPIAValue(prod.d
CONVERT(Varchar (100) ,dbo.fn_ERMPIAValue(prod.d
CONVERT(Numeric (19, 6) ,dbo.fn_ERMPIAValue(prod.d
CONVERT(Numeric (19, 6) ,dbo.fn_ERMPIAValue(prod.d
CONVERT(Numeric (19,6) ,dbo.fn_ERMPIAValue(prod.d
CONVERT(Varchar (100) ,dbo.fn_ERMPIAValue(prod.d
CONVERT(Numeric (19, 6) ,dbo.fn_ERMPIAValue(prod.d
CONVERT(Numeric (19, 6) ,dbo.fn_ERMPIAValue(prod.d
CONVERT(Numeric (19, 6) ,dbo.fn_ERMPIAValue(prod.d
CONVERT(Numeric (19,6) ,dbo.fn_ERMPIAValue(prod.d
CONVERT(Numeric (19, 6) ,dbo.fn_ERMPIAValue(prod.d
CONVERT(Varchar (100) ,dbo.fn_ERMPIAValue(prod.d
CONVERT(Numeric (19, 6) ,dbo.fn_ERMPIAValue(prod.d
CONVERT(Numeric (19, 6) ,dbo.fn_ERMPIAValue(prod.d
-- For Lease Draws set Existing Commitment field to $0 and use in Commitment field
CASE WHEN prod.action_id = 12
THEN 0
ELSE CONVERT(Numeric (19, 6) ,dbo.fn_ERMPIAValue(prod.d
END AS'pia_Existing_Commitment
CONVERT(Bit ,dbo.fn_ERMPIAValue(prod.d
CONVERT(Int ,dbo.fn_ERMPIAValue(prod.d
CONVERT(Int ,dbo.fn_ERMPIAValue(prod.d
CONVERT(Varchar (100) ,dbo.fn_ERMPIAValue(prod.d
CONVERT(Varchar (100) ,dbo.fn_ERMPIAValue(prod.d
CONVERT(Varchar (100) ,dbo.fn_ERMPIAValue(prod.d
CONVERT(Varchar (100) ,dbo.fn_ERMPIAValue(prod.d
CONVERT(Varchar (100) ,dbo.fn_ERMPIAValue(prod.d
CONVERT(Bit ,dbo.fn_ERMPIAValue(prod.d
CONVERT(Numeric (19, 6) ,dbo.fn_ERMPIAValue(prod.d
CONVERT(Varchar (100) ,dbo.fn_ERMPIAValue(prod.d
CONVERT(Bit ,dbo.fn_ERMPIAValue(prod.d
CONVERT(Numeric (19,6) ,dbo.fn_ERMPIAValue(prod.d
CONVERT(Int ,dbo.fn_ERMPIAValue(prod.d
CONVERT(Varchar (100) ,dbo.fn_ERMPIAValue(prod.d
CONVERT(Varchar (100) ,dbo.fn_ERMPIAValue(prod.d
CONVERT(Varchar (100) ,dbo.fn_ERMPIAValue(prod.d
CONVERT(Numeric (19, 6) ,dbo.fn_ERMPIAValue(prod.d
CONVERT(Int ,dbo.fn_ERMPIAValue(prod.d
CONVERT(Numeric (19, 6) ,dbo.fn_ERMPIAValue(prod.d
/*************************
/* Caclualte real margin. What is returned by ePF is */
/* really just the Spread from ERM. */
/* (Actual_Interest_Rate) - (Cost of Funds Used)-(LP) */
/* If its NULL then leave it NULL. */
/*************************
CONVERT(Numeric (19,6) ,dbo.fn_ERMPIAValue(prod.d
CONVERT(Numeric (19,6) ,dbo.fn_ERMPIAValue(prod.d
CONVERT(Numeric (19,6) ,dbo.fn_ERMPIAValue(prod.d
AS'pia_Margin',
CONVERT(Numeric (19, 6) ,dbo.fn_ERMPIAValue(prod.d
-- For Lease Draws use the Existing Commitment field
CASE WHEN prod.action_id = 12
THEN CONVERT(Numeric (19, 6) ,dbo.fn_ERMPIAValue(prod.d
ELSE CONVERT(Numeric (19, 6) ,dbo.fn_ERMPIAValue(prod.d
END AS'pia_New_Commitment',
CONVERT(Numeric (19, 6) ,dbo.fn_ERMPIAValue(prod.d
CONVERT(Varchar (100) ,dbo.fn_ERMPIAValue(prod.d
CONVERT(Bit ,dbo.fn_ERMPIAValue(prod.d
CONVERT(Int ,dbo.fn_ERMPIAValue(prod.d
CONVERT(Varchar (100) ,dbo.fn_ERMPIAValue(prod.d
CONVERT(Bit ,dbo.fn_ERMPIAValue(prod.d
CONVERT(Numeric (19, 6) ,dbo.fn_ERMPIAValue(prod.d
CONVERT(Numeric (19, 6) ,dbo.fn_ERMPIAValue(prod.d
CONVERT(Numeric (19, 6) ,dbo.fn_ERMPIAValue(prod.d
CONVERT(Varchar (100) ,dbo.fn_ERMPIAValue(prod.d
CONVERT(Varchar (100) ,dbo.fn_ERMPIAValue(prod.d
CONVERT(Int ,dbo.fn_ERMPIAValue(prod.d
CONVERT(Varchar (100) ,dbo.fn_ERMPIAValue(prod.d
CONVERT(Varchar (35) ,dbo.fn_ERMPIAValue(prod.d
CONVERT(Varchar (35) ,dbo.fn_ERMPIAValue(prod.d
CONVERT(Varchar (35) ,dbo.fn_ERMPIAValue(prod.d
CONVERT(Numeric (19, 6) ,dbo.fn_ERMPIAValue(prod.d
CONVERT(Numeric (19, 6) ,dbo.fn_ERMPIAValue(prod.d
CONVERT(Numeric (19, 6) ,dbo.fn_ERMPIAValue(prod.d
/*************************
/* If is a variable rate loan, then use the Spread */
/* otherwise determine the Spread as: */
/* - (Actual_Interest_Rate) - (Cost of Funds Used) */
/* Actual_Interest_Rate accounts for all ePF logic. If */
/* its NULL then use what has been typed into ERM. */
/* - For Prime - (neg prime) then multiply by -1 */
/*************************
CASE WHEN dbo.fn_ERMPIAValue(prod.de
THEN CONVERT(numeric(9,5), dbo.fn_ERMPIAValue(prod.de
ELSE ISNULL(CONVERT(numeric(9,5
END *
CASE WHEN CONVERT(Varchar (100) ,dbo.fn_ERMPIAValue(prod.d
THEN -1
ELSE 1
END -- end case statement
AS'pia_Spread_over_Base_Ra
CONVERT(numeric(9,5), dbo.fn_ERMPIAValue(prod.de
CONVERT(Numeric (19,6) ,dbo.fn_ERMPIAValue(prod.d
CONVERT(Numeric (19, 6) ,dbo.fn_ERMPIAValue(prod.d
CONVERT(Varchar (100) ,dbo.fn_ERMPIAValue(prod.d
CONVERT(Int ,dbo.fn_ERMPIAValue(prod.d
/*************************
/* Call funtion which gets the specific fee for the given product. */
/* Only specific fees will be retrieved and as more are needed more */
/* will need to be added. */
/*************************
dbo.fn_ERMProductFee(prod.
dbo.fn_ERMProductFee(prod.
dbo.fn_ERMProductFee(prod.
dbo.fn_ERMProductFee(prod.
dbo.fn_ERMProductFee(prod.
dbo.fn_ERMProductFee(prod.
dbo.fn_ERMProductFee(prod.
dbo.fn_ERMProductFee(prod.
dbo.fn_ERMProductFee(prod.
dbo.fn_ERMProductFee(prod.
dbo.fn_ERMProductFee(prod.
dbo.fn_ERMProductFee(prod.
dbo.fn_ERMProductFee(prod.
dbo.fn_ERMProductFee(prod.
dbo.fn_ERMProductFee(prod.
dbo.fn_ERMProductFee(prod.
dbo.fn_ERMProductFee(prod.
dbo.fn_ERMProductFee(prod.
dbo.fn_ERMProductFee(prod.
dbo.fn_ERMProductFee(prod.
dbo.fn_ERMProductFee(prod.
dbo.fn_ERMProductFee(prod.
dbo.fn_ERMProductFee(prod.
dbo.fn_ERMProductFee(prod.
dbo.fn_ERMProductFee(prod.
dbo.fn_ERMProductFee(prod.
dbo.fn_ERMProductFee(prod.
dbo.fn_ERMProductFee(prod.
dbo.fn_ERMProductFee(prod.
dbo.fn_ERMProductFee(prod.
dbo.fn_ERMProductFee(prod.
dbo.fn_ERMProductFee(prod.
dbo.fn_ERMProductFee(prod.
dbo.fn_ERMProductFee(prod.
dbo.fn_ERMProductFee(prod.
dbo.fn_ERMProductFee(prod.
dbo.fn_ERMProductFee(prod.
dbo.fn_ERMProductFee(prod.
dbo.fn_ERMProductFee(prod.
dbo.fn_ERMProductFee(prod.
dbo.fn_ERMProductFee(prod.
dbo.fn_ERMProductFee(prod.
dbo.fn_ERMProductFee(prod.
dbo.fn_ERMProductFee(prod.
dbo.fn_ERMProductFee(prod.
dbo.fn_ERMProductFee(prod.
dbo.fn_ERMProductFee(prod.
dbo.fn_ERMProductFee(prod.
dbo.fn_ERMProductFee(prod.
dbo.fn_ERMProductFee(prod.
dbo.fn_ERMProductFee(prod.
dbo.fn_ERMProductFee(prod.
dbo.fn_ERMProductFee(prod.
dbo.fn_ERMProductFee(prod.
dbo.fn_ERMProductFee(prod.
dbo.fn_ERMProductFee(prod.
dbo.fn_ERMProductFee(prod.
dbo.fn_ERMProductFee(prod.
dbo.fn_ERMProductFee(prod.
dbo.fn_ERMProductFee(prod.
dbo.fn_ERMProductFee(prod.
dbo.fn_ERMProductFee(prod.
dbo.fn_ERMProductFee(prod.
dbo.fn_ERMProductFee(prod.
dbo.fn_ERMProductFee(prod.
dbo.fn_ERMProductFee(prod.
dbo.fn_ERMProductFee(prod.
dbo.fn_ERMProductFee(prod.
dbo.fn_ERMProductFee(prod.
dbo.fn_ERMProductFee(prod.
dbo.fn_ERMProductFee(prod.
dbo.fn_ERMProductFee(prod.
dbo.fn_ERMProductFee(prod.
dbo.fn_ERMProductFee(prod.
dbo.fn_ERMProductFee(prod.
dbo.fn_ERMProductFee(prod.
dbo.fn_ERMProductFee(prod.
dbo.fn_ERMProductFee(prod.
dbo.fn_ERMProductFee(prod.
dbo.fn_ERMProductFee(prod.
dbo.fn_ERMProductFee(prod.
dbo.fn_ERMProductFee(prod.
dbo.fn_ERMProductFee(prod.
dbo.fn_ERMProductFee(prod.
dbo.fn_ERMProductFee(prod.
dbo.fn_ERMProductFee(prod.
dbo.fn_ERMProductFee(prod.
dbo.fn_ERMProductFee(prod.
dbo.fn_ERMProductFee(prod.
dbo.fn_ERMProductFee(prod.
dbo.fn_ERMProductFee(prod.
dbo.fn_ERMProductFee(prod.
dbo.fn_ERMProductFee(prod.
dbo.fn_ERMProductFee(prod.
dbo.fn_ERMProductFee(prod.
dbo.fn_ERMProductFee(prod.
dbo.fn_ERMProductFee(prod.
dbo.fn_ERMProductFee(prod.
dbo.fn_ERMProductFee(prod.
dbo.fn_ERMProductFee(prod.
dbo.fn_ERMProductFee(prod.
dbo.fn_ERMProductFee(prod.
dbo.fn_ERMProductFee(prod.
dbo.fn_ERMProductFee(prod.
dbo.fn_ERMProductFeeTotal(
FROM ERM.dbo.DEAL_PRODUCT prod -- Product table
INNER JOIN
ERM.dbo.DEAL deal -- Deal table
ON prod.deal_id = deal.deal_id
INNER JOIN
ERM.dbo.PRODUCT_FAMILY prodfam -- Product Family associated with the deal NOT the product level
ON deal.product_family_id = prodfam.product_family_id
INNER JOIN
ERM.dbo.SALES_OPPORTUNITY so -- Sales Opportunity table
ON deal.opportunity_id = so.opportunity_id
LEFT OUTER JOIN
ERM.dbo.CAMPAIGN camp -- Campaign Lookup table
ON so.campaign_id = camp.campaign_id
INNER JOIN
[Commercial_Data_Store].db
ON so.profile_id = profdet.ERM_PN
INNER JOIN
[Commercial_Data_Store].db
ON prod.product_id = proditm.product_id
INNER JOIN
ERM.dbo.DISPOSITION_REASON
ON prod.disposition_reason_id
INNER JOIN
ERM.dbo.AWARDED_COMPANY awrdcomp -- Company Awarded to
ON prod.awarded_company_id = awrdcomp.awarded_company_i
INNER JOIN
ERM.dbo.ACTION_TYPE actn -- Action lookup table
ON prod.action_id = actn.action_id
WHERE prod.disposition_status_fl
AND so.delete_flag = 0 -- No removed sales opportunities
AND deal.delete_flag = 0 -- No removed deals (sales efforts)
AND prod.delete_flag = 0 -- No removed products
AND prod.dispose_date >= @RollingStartDate -- Only products which have been closed in past 5 years since Jan 1 of current year
END -- End of Stored Procedure