SQL Server Forums
Profile | Register | Active Topics | Members | Search | Forum FAQ
 
Register Now and get your question answered!
Username:
Password:
Save Password
Forgot your Password?

 All Forums
 General SQL Server Forums
 New to SQL Server Programming
 Can I simplify this using CTE's?
 New Topic  Reply to Topic
 Printer Friendly
Author Previous Topic Topic Next Topic  

Rasta Pickles
Posting Yak Master

United Kingdom
133 Posts

Posted - 07/18/2012 :  14:19:17  Show Profile  Reply with Quote
I've inherited the following and the third party software I'm using doesn't recognise temporary tables although it seems to be fine with CTE's.

I have no experience with CTE's so down't even know if what I'm asking is do-able.

Any advice gratefully accepted


DECLARE @FutureReleases AS TABLE (TRANSACTION_MONTH  CHAR(6)
                                 ,BrCID VARCHAR (10)
                                 ,Fnid VARCHAR (2)
                                 ,shid VARCHAR (3)
                                 ,INTEREST MONEY
                                 ,INTEREST_EARNED MONEY
                                 ,NET_INTEREST_OUTSTANDING MONEY)           
                                    
INSERT INTO @FutureReleases

SELECT CONVERT(CHAR(6),TH.EFFECTIVE_DATE,112) AS TRANSACTION_MONTH
,RIGHT('000' + CAST(A.BROKER_COMPANY_ID AS VARCHAR), 3) + '_' + 
 RIGHT('000' + CAST([INSURANCE_TYPE_ID] AS VARCHAR), 3) AS BrCID
,RIGHT('0000' + CAST(A.FINANCIER_ID AS VARCHAR), 2) AS Fnid
,RIGHT('0000' + CAST(A.SCHEME_ID AS VARCHAR), 3) AS shid
,ISNULL(SUM(CASE WHEN TH.TRANSACTION_TYPE_ID IN (1, 2, 3, 5) THEN ISNULL(TH.INTEREST_VALUE, 0) END), 0) AS INTEREST
,ISNULL(SUM(CASE WHEN TH.TRANSACTION_TYPE_ID IN (4, 9, 10, 20, 21, 24) THEN ISNULL(INTEREST_VALUE, 0)  END), 0) AS INTEREST_EARNED
,ISNULL(SUM(CASE WHEN TH.TRANSACTION_TYPE_ID IN (1, 2, 3, 5) THEN ISNULL(TH.INTEREST_VALUE, 0) END), 0)
-
ISNULL(SUM(CASE WHEN TH.TRANSACTION_TYPE_ID IN (4, 9, 10, 20, 21, 24) THEN ISNULL(INTEREST_VALUE, 0)  END), 0)AS NET_INTEREST_OUTSTANDING
FROM TRANSACTION_HEADER AS TH
JOIN AGREEMENTS AS A ON A.AGREEMENT_ID = TH.AGREEMENT_ID
WHERE TRANSACTION_TYPE_ID IN (1, 2, 3, 4, 5, 9, 10, 20, 21, 24)
AND CHARGE_NUMBER IS NULL
GROUP BY CONVERT(CHAR(6),TH.EFFECTIVE_DATE,112), BROKER_COMPANY_ID, INSURANCE_TYPE_ID, FINANCIER_ID, SCHEME_ID

DECLARE @YearMonth AS TABLE (TRANSACTION_MONTH CHAR(6))    

INSERT INTO @YearMonth
SELECT DISTINCT TRANSACTION_MONTH
FROM @FutureReleases

DECLARE @Cumulative AS TABLE (TRANSACTION_MONTH  CHAR(6)
                                 ,BrCID VARCHAR (10)
                                 ,Fnid VARCHAR (2)
                                 ,shid VARCHAR (3))    
                                    
INSERT INTO @Cumulative
SELECT DISTINCT YM.TRANSACTION_MONTH
,BrCID
,Fnid
,shid
FROM @YearMonth AS YM
CROSS JOIN @FutureReleases AS FR

SELECT
TRANSACTION_MONTH
,BrCID
,Fnid
,shid
,(SELECT ISNULL(SUM(ISNULL(NET_INTEREST_OUTSTANDING, 0)), 0) FROM @FutureReleases AS F 
WHERE F.BrCID = C.BrCID 
AND F.Fnid = C.Fnid 
AND F.shid = C.shid
AND F.TRANSACTION_MONTH <= C.TRANSACTION_MONTH) AS INTEREST_FOR_FUTURE_RELEASE
FROM
@Cumulative AS C
WHERE
(SELECT ISNULL(SUM(ISNULL(NET_INTEREST_OUTSTANDING, 0)), 0) FROM @FutureReleases AS F 
WHERE F.BrCID = C.BrCID 
AND F.Fnid = C.Fnid 
AND F.shid = C.shid
AND F.TRANSACTION_MONTH <= C.TRANSACTION_MONTH) <> 0

Edited by - Rasta Pickles on 07/18/2012 14:20:06

nigelrivett
Flowing Fount of Yak Knowledge

United Kingdom
3328 Posts

Posted - 07/18/2012 :  14:39:13  Show Profile  Visit nigelrivett's Homepage  Reply with Quote
>> the third party software I'm using doesn't recognise temporary tables
Try this
put a
set nocount on
at the top of the code
after that add
if 1=0 -- return resultset with output format
select TRANSACTION_MONTH = space(6) ,
BrCID = space(10) ,
....

Could be that the front end is trying to get the resultset format before the call.
This will use the first select it finds - hence the select that is never executed
The
set nocount on
is to stop it getting upset by the closed resultset for the rowcount.



==========================================
Cursors are useful if you don't know sql.
SSIS can be used in a similar way.
Beer is not cold and it isn't fizzy.
Go to Top of Page

nigelrivett
Flowing Fount of Yak Knowledge

United Kingdom
3328 Posts

Posted - 07/18/2012 :  14:42:42  Show Profile  Visit nigelrivett's Homepage  Reply with Quote
alternatively using ctes

;with FutureReleases as
(
SELECT CONVERT(CHAR(6),TH.EFFECTIVE_DATE,112) AS TRANSACTION_MONTH
,RIGHT('000' + CAST(A.BROKER_COMPANY_ID AS VARCHAR), 3) + '_' +
RIGHT('000' + CAST([INSURANCE_TYPE_ID] AS VARCHAR), 3) AS BrCID
,RIGHT('0000' + CAST(A.FINANCIER_ID AS VARCHAR), 2) AS Fnid
,RIGHT('0000' + CAST(A.SCHEME_ID AS VARCHAR), 3) AS shid
,ISNULL(SUM(CASE WHEN TH.TRANSACTION_TYPE_ID IN (1, 2, 3, 5) THEN ISNULL(TH.INTEREST_VALUE, 0) END), 0) AS INTEREST
,ISNULL(SUM(CASE WHEN TH.TRANSACTION_TYPE_ID IN (4, 9, 10, 20, 21, 24) THEN ISNULL(INTEREST_VALUE, 0) END), 0) AS INTEREST_EARNED
,ISNULL(SUM(CASE WHEN TH.TRANSACTION_TYPE_ID IN (1, 2, 3, 5) THEN ISNULL(TH.INTEREST_VALUE, 0) END), 0)
-
ISNULL(SUM(CASE WHEN TH.TRANSACTION_TYPE_ID IN (4, 9, 10, 20, 21, 24) THEN ISNULL(INTEREST_VALUE, 0) END), 0)AS NET_INTEREST_OUTSTANDING
FROM TRANSACTION_HEADER AS TH
JOIN AGREEMENTS AS A ON A.AGREEMENT_ID = TH.AGREEMENT_ID
WHERE TRANSACTION_TYPE_ID IN (1, 2, 3, 4, 5, 9, 10, 20, 21, 24)
AND CHARGE_NUMBER IS NULL
GROUP BY CONVERT(CHAR(6),TH.EFFECTIVE_DATE,112), BROKER_COMPANY_ID, INSURANCE_TYPE_ID, FINANCIER_ID, SCHEME_ID
) ,
YearMonth as
(
SELECT DISTINCT TRANSACTION_MONTH
FROM FutureReleases
) ,
Cumulative as
(
SELECT DISTINCT YM.TRANSACTION_MONTH
,BrCID
,Fnid
,shid
FROM YearMonth AS YM
CROSS JOIN FutureReleases AS FR
)
SELECT
TRANSACTION_MONTH
,BrCID
,Fnid
,shid
,(SELECT ISNULL(SUM(ISNULL(NET_INTEREST_OUTSTANDING, 0)), 0) FROM FutureReleases AS F
WHERE F.BrCID = C.BrCID
AND F.Fnid = C.Fnid
AND F.shid = C.shid
AND F.TRANSACTION_MONTH <= C.TRANSACTION_MONTH) AS INTEREST_FOR_FUTURE_RELEASE
FROM
Cumulative AS C
WHERE
(SELECT ISNULL(SUM(ISNULL(NET_INTEREST_OUTSTANDING, 0)), 0) FROM FutureReleases AS F
WHERE F.BrCID = C.BrCID
AND F.Fnid = C.Fnid
AND F.shid = C.shid
AND F.TRANSACTION_MONTH <= C.TRANSACTION_MONTH) <> 0


==========================================
Cursors are useful if you don't know sql.
SSIS can be used in a similar way.
Beer is not cold and it isn't fizzy.
Go to Top of Page

Rasta Pickles
Posting Yak Master

United Kingdom
133 Posts

Posted - 07/19/2012 :  00:39:49  Show Profile  Reply with Quote
Thank you Nigel, I will try that out later.

Much appreciated
Go to Top of Page

Rasta Pickles
Posting Yak Master

United Kingdom
133 Posts

Posted - 07/19/2012 :  13:28:24  Show Profile  Reply with Quote
Are CTEs inefficient?

My code as adapted by Nigel was still running in Management Studio when I left the office earlier (2hrs since start) - the original code took approximately 37 minutes to complete.

Go to Top of Page

visakh16
Very Important crosS Applying yaK Herder

India
47157 Posts

Posted - 07/19/2012 :  13:29:51  Show Profile  Reply with Quote
quote:
Originally posted by Rasta Pickles

Are CTEs inefficient?

My code as adapted by Nigel was still running in Management Studio when I left the office earlier (2hrs since start) - the original code took approximately 37 minutes to complete.




depends on how you've written them and also on level of recursion. Did you analyse and see whats causing bottleneck in execution plan?

------------------------------------------------------------------------------------------------------
SQL Server MVP
http://visakhm.blogspot.com/

Go to Top of Page
  Previous Topic Topic Next Topic  
 New Topic  Reply to Topic
 Printer Friendly
Jump To:
SQL Server Forums © 2000-2009 SQLTeam Publishing, LLC Go To Top Of Page
This page was generated in 0.47 seconds. Powered By: Snitz Forums 2000