| Author |
Topic |
|
sunsanvin
Master Smack Fu Yak Hacker
1274 Posts |
Posted - 2007-05-14 : 03:29:20
|
| Dear Folks,The query is taking 30 Sec of time, can you please suggest some better way?select * from (SELECT COLUMN001 ACCOUNT_ID, COLUMN002 BRANCH_ID, COLUMN003 ACCOUNT_CODE, COLUMN004 ACCOUNT_NAME, case when (select dbo.fgenaccbalance('34D0DB32-5F21-4E86-9AB2-6E30FBF25149' ,column001,getdate())) > 0 then (select dbo.fgenaccbalance('34D0DB32-5F21-4E86-9AB2-6E30FBF25149',column001,getdate())) else 0 end as [Net_Debit_Balance] , case when (select dbo.fgenaccbalance('34D0DB32-5F21-4E86-9AB2-6E30FBF25149',column001,getdate()))< 0 then -(select dbo.fgenaccbalance( '34D0DB32-5F21-4E86-9AB2-6E30FBF25149',column001,getdate())) else 0 end as [Net_Credit_Balance] , column005 ALIAS_NAME, COLUMN006 SHORT_NAME, COLUMN010 CONTROL_ACC1 ,COLUMN007 ACC_TYPE_ID, COLUMN008 ACCGROUP_ID, COLUMN009 CG_ACCGROUP_ID, COLUMN010 CONTROL_ACC, COLUMN011 CONTROL_ACCTYPE, COLUMN012 BLOCKED,COLUMN013 BUDGETED, COLUMN014 ACCOUNT_TYPE FROM OATABLE014 where ( COLUMN010 !='1' and COLUMN012 !='1'and ( COLUMN002 = '34d0db32-5f21-4e86-9ab2-6e30fbf25149' or COLUMN002 = 'ca43fabc-0ee0-4118-b541-9ef17b0f95e3' ) ) union select COLUMN001 ACCOUNT_ID, COLUMN009 BRANCH_ID, COLUMN003 ACCOUNT_CODE, COLUMN004 ACCOUNT_NAME, case when (select dbo.fSubAccBalance('34D0DB32-5F21-4E86-9AB2-6E30FBF25149' ,column001,getdate())) > 0 then (select dbo.fSubAccBalance('34D0DB32-5F21-4E86-9AB2-6E30FBF25149',column001,getdate())) else 0 end as [Net_Debit_Balance] , case when (select dbo.fSubAccBalance('34D0DB32-5F21-4E86-9AB2-6E30FBF25149',column001,getdate())) < 0 then -(select dbo.fSubAccBalance( '34D0DB32-5F21-4E86-9AB2-6E30FBF25149',column001,getdate())) else 0 end as [Net_Credit_Balance] , column005 ALIAS_NAME, COLUMN006 SHORT_NAME, COLUMN002 CONTROL_ACC1,COLUMN010 ACC_TYPE_ID, '-' ACCGROUP_ID, COLUMN009 CG_ACCGROUP_ID, '-' CONTROL_ACC, '-' CONTROL_ACCTYPE, '-' BLOCKED, '-' BUDGETED, 'Cnt'+Convert(char(1),column010,001) ACCOUNT_TYPE from oatable030 ) TBL where ( ( tbl.branch_id = '34d0db32-5f21-4e86-9ab2-6e30fbf25149' or tbl.branch_id = 'ca43fabc-0ee0-4118-b541-9ef17b0f95e3' ) and tbl.acc_type_id = 'C' ) order by tbl.account_name VinodEven you learn 1%, Learn it with 100% confidence. |
|
|
harsh_athalye
Master Smack Fu Yak Hacker
5581 Posts |
Posted - 2007-05-14 : 03:42:32
|
No wonder!!You are calling a function multiple times inside a case. Wrap function call inside the derived table and then apply the CASE statement over the contents of derived table to avoid repeated function calls.Something like:Select ACCOUNT_ID, BRANCH_ID, ACCOUNT_CODE, ACCOUNT_NAME, case when Acc_Balance > 0 then Acc_Balance else 0 end as [Net_Debit_Balance], case when Acc_Balance < 0 then (Acc_Balance * -1) else 0 end as [Net_Credit_Balance], ALIAS_NAME, SHORT_NAME, CONTROL_ACC1, ACC_TYPE_ID, ACCGROUP_ID, CG_ACCGROUP_ID, CONTROL_ACC, CONTROL_ACCTYPE, BLOCKED, BUDGETED, ACCOUNT_TYPE From(SELECT COLUMN001 ACCOUNT_ID, COLUMN002 BRANCH_ID, COLUMN003 ACCOUNT_CODE, COLUMN004 ACCOUNT_NAME, dbo.fgenaccbalance('34D0DB32-5F21-4E86-9AB2-6E30FBF25149' ,column001,getdate()) as Acc_Balance column005 ALIAS_NAME, COLUMN006 SHORT_NAME, COLUMN010 CONTROL_ACC1 ,COLUMN007 ACC_TYPE_ID, COLUMN008 ACCGROUP_ID, COLUMN009 CG_ACCGROUP_ID, COLUMN010 CONTROL_ACC, COLUMN011 CONTROL_ACCTYPE, COLUMN012 BLOCKED, COLUMN013 BUDGETED, COLUMN014 ACCOUNT_TYPE FROM OATABLE014 where COLUMN010 <> '1' and COLUMN012 <> '1' and (COLUMN002 in ('34d0db32-5f21-4e86-9ab2-6e30fbf25149','ca43fabc-0ee0-4118-b541-9ef17b0f95e3'))) tUnion...Harsh AthalyeIndia."The IMPOSSIBLE is often UNTRIED" |
 |
|
|
sunsanvin
Master Smack Fu Yak Hacker
1274 Posts |
Posted - 2007-05-14 : 04:27:16
|
| This is great Idea HarshVinodEven you learn 1%, Learn it with 100% confidence. |
 |
|
|
sunsanvin
Master Smack Fu Yak Hacker
1274 Posts |
Posted - 2007-05-14 : 04:28:53
|
| But Still Iwas unable to complete the query.Can you please write the complete query for me?thank you very muchVinodEven you learn 1%, Learn it with 100% confidence. |
 |
|
|
sunsanvin
Master Smack Fu Yak Hacker
1274 Posts |
Posted - 2007-05-14 : 04:51:56
|
| Harsh,can you Please write the query for me pleaseVinodEven you learn 1%, Learn it with 100% confidence. |
 |
|
|
SwePeso
Patron Saint of Lost Yaks
30421 Posts |
Posted - 2007-05-14 : 05:01:36
|
| Please try for yourself first.Would you really have us to do your job for you?Peter LarssonHelsingborg, Sweden |
 |
|
|
sunsanvin
Master Smack Fu Yak Hacker
1274 Posts |
Posted - 2007-05-14 : 05:13:35
|
| Sorry Peso,but that query is a gaint for me.that is why I've asked again and againVinodEven you learn 1%, Learn it with 100% confidence. |
 |
|
|
sunsanvin
Master Smack Fu Yak Hacker
1274 Posts |
Posted - 2007-05-14 : 05:46:56
|
| Dear folks,What is the wrong in my query?Select ACCOUNT_ID, BRANCH_ID, ACCOUNT_CODE, ACCOUNT_NAME, case when Acc_Balance > 0 then Acc_Balance else 0 end as [Net_Debit_Balance], case when Acc_Balance < 0 then (Acc_Balance * -1) else 0 end as [Net_Credit_Balance], ALIAS_NAME, SHORT_NAME, CONTROL_ACC1, ACC_TYPE_ID, ACCGROUP_ID, CG_ACCGROUP_ID, CONTROL_ACC, CONTROL_ACCTYPE, BLOCKED, BUDGETED, ACCOUNT_TYPE From(SELECT COLUMN001 ACCOUNT_ID, COLUMN002 BRANCH_ID, COLUMN003 ACCOUNT_CODE, COLUMN004 ACCOUNT_NAME, dbo.fgenaccbalance('34D0DB32-5F21-4E86-9AB2-6E30FBF25149' ,column001,getdate()) as Acc_Balance, column005 ALIAS_NAME, COLUMN006 SHORT_NAME, COLUMN010 CONTROL_ACC1 ,COLUMN007 ACC_TYPE_ID, COLUMN008 ACCGROUP_ID, COLUMN009 CG_ACCGROUP_ID, COLUMN010 CONTROL_ACC, COLUMN011 CONTROL_ACCTYPE, COLUMN012 BLOCKED, COLUMN013 BUDGETED, COLUMN014 ACCOUNT_TYPE FROM OATABLE014 where COLUMN010 <> '1' and COLUMN012 <> '1' and (COLUMN002 in ('34d0db32-5f21-4e86-9ab2-6e30fbf25149','ca43fabc-0ee0-4118-b541-9ef17b0f95e3'))) tUNIONSELECT COLUMN001 ACCOUNT_ID, COLUMN009 BRANCH_ID, COLUMN003 ACCOUNT_CODE, COLUMN004 ACCOUNT_NAME, CASE WHEN ACC_BALANCE > 0 THEN ACC_BALANCE ELSE 0 END AS [NET_DEBIT_BALANCE], CASE WHEN ACC_BALANCE < 0 THEN (ACC_BALANCE * -1) ELSE 0 END AS [NET_CREDIT_BALANCE], ALIAS_NAME, SHORT_NAME, CONTROL_ACC1, ACC_TYPE_ID, ACCGROUP_ID, CG_ACCGROUP_ID, CONTROL_ACC, CONTROL_ACCTYPE, BLOCKED, BUDGETED, ACCOUNT_TYPEFROM oatable030) tblwhere tbl.branch_id in('34d0db32-5f21-4e86-9ab2-6e30fbf25149', 'ca43fabc-0ee0-4118-b541-9ef17b0f95e3' ) and tbl.acc_type_id = 'C' order by tbl.account_nameVinodEven you learn 1%, Learn it with 100% confidence. |
 |
|
|
SwePeso
Patron Saint of Lost Yaks
30421 Posts |
Posted - 2007-05-14 : 05:50:21
|
| ACC_BALANCE is the name of the COLUMN from the DERIVED TABLE!You should use the function as Harsh described to you even for the second part of the select statement (below the UNION).Peter LarssonHelsingborg, Sweden |
 |
|
|
SwePeso
Patron Saint of Lost Yaks
30421 Posts |
Posted - 2007-05-14 : 06:04:45
|
| [code]SELECT d.ACCOUNT_ID, d.BRANCH_ID, d.ACCOUNT_CODE, d.ACCOUNT_NAME, CASE WHEN AccBalance > 0 THEN AccBalance ELSE 0 END AS Net_Debit_Balance, CASE WHEN AccBalance < 0 THEN ABS(AccBalance) ELSE 0 END AS Net_Credit_Balance, d.ALIAS_NAME, d.SHORT_NAME, d.CONTROL_ACC1, d.ACC_TYPE_ID, d.ACCGROUP_ID, d.CG_ACCGROUP_ID, d.CONTROL_ACC, d.CONTROL_ACCTYPE, d.BLOCKED, d.BUDGETED, d.ACCOUNT_TYPEFROM ( SELECT COLUMN001 AS ACCOUNT_ID, COLUMN002 AS BRANCH_ID, COLUMN003 AS ACCOUNT_CODE, COLUMN004 AS ACCOUNT_NAME, dbo.fGenAccBalance(COLUMN002, COLUMN001, CURRENT_TIMESTAMP) AS AccBalance, COLUMN005 AS ALIAS_NAME, COLUMN006 AS SHORT_NAME, COLUMN010 AS CONTROL_ACC1, COLUMN007 AS ACC_TYPE_ID, COLUMN008 AS ACCGROUP_ID, COLUMN009 AS CG_ACCGROUP_ID, COLUMN010 AS CONTROL_ACC, COLUMN011 AS CONTROL_ACCTYPE, COLUMN012 AS BLOCKED, COLUMN013 AS BUDGETED, COLUMN014 AS ACCOUNT_TYPE FROM OATABLE014 WHERE COLUMN010 <> '1' AND COLUMN012 <> '1' AND COLUMN002 IN ('34d0db32-5f21-4e86-9ab2-6e30fbf25149', 'ca43fabc-0ee0-4118-b541-9ef17b0f95e3') AND COLUMN007 = 'C' UNION SELECT COLUMN001, COLUMN009, COLUMN003, COLUMN004, dbo.fSubAccBalance(COLUMN009, COLUMN001, CURRENT_TIMESTAMP), COLUMN005, COLUMN006, COLUMN002, COLUMN010, '-', COLUMN009, '-', '-', '-', '-', 'Cnt' + CAST(COLUMN010 AS CHAR) FROM oatable030 WHERE COLUMN009 IN ('34d0db32-5f21-4e86-9ab2-6e30fbf25149', 'ca43fabc-0ee0-4118-b541-9ef17b0f95e3') AND COLUMN010 = 'C' ) AS dORDER BY d.ACCOUNT_NAME[/code]Now go tell your manager you're done with the task for this week.Peter LarssonHelsingborg, Sweden |
 |
|
|
sunsanvin
Master Smack Fu Yak Hacker
1274 Posts |
Posted - 2007-05-14 : 06:15:26
|
| Thank you very much peso, Actually this is my friend's work, he is a developer in crystal reports.I'm a junior DBA. my friend asked for the help, another friend Peso did that help for me.thank you expertVinodEven you learn 1%, Learn it with 100% confidence. |
 |
|
|
sunsanvin
Master Smack Fu Yak Hacker
1274 Posts |
Posted - 2007-05-14 : 06:17:12
|
| Dear Peso, But I didnt get the output. no rows were generated with this query.I dont know what happendVinodEven you learn 1%, Learn it with 100% confidence. |
 |
|
|
SwePeso
Patron Saint of Lost Yaks
30421 Posts |
Posted - 2007-05-14 : 06:28:47
|
| See my edited answer.Change the appropriate WHERE, marked with red color.Peter LarssonHelsingborg, Sweden |
 |
|
|
sunsanvin
Master Smack Fu Yak Hacker
1274 Posts |
Posted - 2007-05-14 : 06:32:04
|
| Peso is Always Greatthank you Peso, it has taken 12 sec now. reduced from 30 sec to 12 sec. thank you very muchVinodEven you learn 1%, Learn it with 100% confidence. |
 |
|
|
SwePeso
Patron Saint of Lost Yaks
30421 Posts |
Posted - 2007-05-14 : 06:35:39
|
| I am sure the query can be run faster.Post the code for the fGenAccBalance function and fSubAccBalance function.Peter LarssonHelsingborg, Sweden |
 |
|
|
sunsanvin
Master Smack Fu Yak Hacker
1274 Posts |
Posted - 2007-05-14 : 06:41:35
|
| --- Here is the function (fGenAccBalance ) CREATE FUNCTION fGenAccBalance (@inBranchId VARCHAR(50), @inAccountId VARCHAR(50), @inAsOnDate DATETIME) RETURNS DECIMAL(34,4) AS BEGIN DECLARE @strOpDate AS CHAR(10) DECLARE @strGetFrom AS CHAR(2) DECLARE @dblOpBalance AS DECIMAL(34,4) -- Getting Recent Closure date from Account Period Balance SELECT TOP 1 @strGetFrom = 'PB', @strOpDate = CONVERT(CHAR(10),COLUMN004,120) FROM OATABLE066 apb WHERE COLUMN003 = @inBranchId AND CONVERT(CHAR(10),COLUMN004,120) <= CONVERT(CHAR(10),@inAsOnDate,120) ORDER BY COLUMN004 DESC -- If no records in Account Period Balance, Getting from Account Opening Balance IF (@@ROWCOUNT=0) BEGIN SELECT TOP 1 @strGetFrom = 'OB', @strOpDate = CONVERT(CHAR(10),COLUMN005,120) FROM OATABLE044 aob WHERE COLUMN010 = @inBranchId AND CONVERT(CHAR(10),COLUMN005,120) <= CONVERT(CHAR(10),@inAsOnDate,120) ORDER BY COLUMN005 DESC IF (@@ROWCOUNT = 0) BEGIN SET @strOpDate = '' SET @strGetFrom = '' END END -- Getting Balance from Account Period Balance IF @strGetFrom = 'PB' SELECT @dblOpBalance = COLUMN006 - COLUMN007 FROM OATABLE066 apb WHERE COLUMN003 = @inBranchId AND COLUMN005 = @inAccountId AND CONVERT(CHAR(10),COLUMN004,120) = @strOpDate -- If no records in Account Period Balance, Getting from Account Opening Balance IF @strGetFrom = 'OB' SELECT TOP 1 @dblOpBalance = COLUMN007 - COLUMN008 FROM OATABLE044 aob WHERE COLUMN010 = @inBranchId AND COLUMN006 = @inAccountId AND CONVERT(CHAR(10),COLUMN005,120) = @strOpDate IF @@ROWCOUNT=0 SET @dblOpBalance = 0 SELECT @dblOpBalance = @dblOpBalance + ISNULL(SUM(COLUMN012 - COLUMN013),0) FROM OATABLE064 agl WHERE COLUMN002 = @inBranchId AND COLUMN008 = @inAccountId AND (CONVERT(CHAR(10),COLUMN007,120) BETWEEN @strOpDate AND CONVERT(CHAR(10),@inAsOnDate,120)) RETURN @dblOpBalance END ------another function (fSubAccBalance) CREATE FUNCTION fSubAccBalance (@prmBranchId VARCHAR(50), @prmSubAccId VARCHAR(50), @prmAsOnDate DATETIME) RETURNS DECIMAL (34,4) AS BEGIN DECLARE @dtOpBalanceDate CHAR(10) DECLARE @dblOpBalanceType CHAR(1) DECLARE @dblClBalance DECIMAL(34,4) SELECT TOP 1 @dblOpBalanceType = 'P', @dtOpBalanceDate = CONVERT(CHAR(10),sap.COLUMN004,120) FROM OaTable067 sap WHERE sap.COLUMN003 = @prmBranchId AND CONVERT(CHAR(10),sap.COLUMN004,120) <= CONVERT(CHAR(10),@prmAsOnDate,120) ORDER BY COLUMN004 DESC -- There is no record. So geting from Opening Balance table IF @@ROWCOUNT = 0 SELECT TOP 1 @dblOpBalanceType = 'O', @dtOpBalanceDate = CONVERT(CHAR(10),ao.COLUMN005,120) FROM OATABLE044 ao WHERE ao.COLUMN010 = @prmBranchId AND CONVERT(CHAR(10),ao.COLUMN005,120) <= CONVERT(CHAR(10),@prmAsOnDate,120) -- There is no record in Opening balance table also IF @@ROWCOUNT = 0 BEGIN SET @dtOpBalanceDate = '' SET @dblOpBalanceType = '' END IF @dblOpBalanceType = 'P' -- Period Balance is there SELECT @dblClBalance = ISNULL( -- Balance from Period Balance table (SELECT sap.COLUMN007 - sap.COLUMN008 FROM OATABLE067 sap WHERE sap.COLUMN003 = @prmBranchId AND sap.COLUMN006 = @prmSubAccId AND CONVERT(CHAR(10),sap.COLUMN004,120) = @dtOpBalanceDate) ,0) + ISNULL( -- Fetching sum of Debit and Credit from Sub A/c ledger (SELECT SUM(COLUMN013 - COLUMN014) FROM OATABLE065 sal WHERE sal.COLUMN002 = @prmBranchId AND sal.COLUMN009 = @prmSubAccId AND (CONVERT(CHAR(10),sal.COLUMN007,120) BETWEEN @dtOpBalanceDate AND @prmAsOnDate)) ,0) FROM OATABLE030 sa WHERE sa.COLUMN001 = @prmSubAccId IF @@ROWCOUNT = 0 -- There is no record in Sub Account BEGIN SET @dtOpBalanceDate = '' SET @dblOpBalanceType = '' SET @dblClBalance = 0 END IF @dblOpBalanceType = 'O' SELECT @dblClBalance = ISNULL( -- Opening Balance from Opening Balance table (SELECT sao.COLUMN005 - sao.COLUMN006 FROM OATable044 ao, OATABLE045 sao WHERE ao.COLUMN001 = sao.COLUMN001 AND sao.COLUMN007 = @prmBranchId AND sao.COLUMN004 = @prmSubAccId AND CONVERT(CHAR(10),sao.COLUMN004,120) = @dtOpBalanceDate) ,0) + ISNULL( -- Fetching sum of Debit and Credit from Sub A/c ledger (SELECT SUM(COLUMN013 - COLUMN014) FROM OATABLE065 sal WHERE sal.COLUMN002 = @prmBranchId AND sal.COLUMN009 = @prmSubAccId AND (CONVERT(CHAR(10),sal.COLUMN007,120) BETWEEN @dtOpBalanceDate AND @prmAsOnDate)) ,0) FROM OATABLE030 sa WHERE sa.COLUMN001 = @prmSubAccId IF @@ROWCOUNT = 0 -- There is no record in Sub Account SET @dblClBalance = 0 IF @dblOpBalanceType = '' SELECT @dblClBalance = ISNULL( -- Fetching sum of Debit and Credit from Sub A/c ledger (SELECT SUM(COLUMN013 - COLUMN014) FROM OATABLE065 sal WHERE sal.COLUMN002 = @prmBranchId AND sal.COLUMN009 = @prmSubAccId AND (CONVERT(CHAR(10),sal.COLUMN007,120) BETWEEN @dtOpBalanceDate AND @prmAsOnDate)) ,0) FROM OATABLE030 sa WHERE sa.COLUMN001 = @prmSubAccId IF @@ROWCOUNT = 0 -- There is no transactions in Sub a/c ledger for Sub Account SET @dblClBalance = 0 RETURN @dblClBalance END VinodEven you learn 1%, Learn it with 100% confidence. |
 |
|
|
SwePeso
Patron Saint of Lost Yaks
30421 Posts |
Posted - 2007-05-14 : 07:41:35
|
This might perform better!ALTER FUNCTION fGenAccBalance( @BranchID VARCHAR(50), @AccountID VARCHAR(50), @AsOnDate DATETIME)RETURNS DECIMAL(34,4)ASBEGIN DECLARE @d DATETIME, @b1 DECIMAL(34,4), @b2 DECIMAL(34,4) SELECT TOP 1 @d = DATEADD(DAY, DATEDIFF(DAY, 0, COLUMN004), 0), @b1 = COALESCE(COLUMN006, 0) - COALESCE(COLUMN007, 0), FROM OATABLE066 WHERE COLUMN003 = @BranchID AND COLUMN005 = @AccountID AND COLUMN004 <= @AsOnDate ORDER BY COLUMN004 DESC IF @b1 IS NULL SELECT TOP 1 @d = DATEADD(DAY, DATEDIFF(DAY, 0, COLUMN005), 0), @b1 = COALESCE(COLUMN007, 0) - COALESCE(COLUMN008, 0) FROM OATABLE044 WHERE COLUMN010 = @BranchID AND COLUMN006 = @AccountID AND COLUMN005 <= @AsOnDate ORDER BY COLUMN005 DESC SELECT @b2 = SUM(COALESCE(COLUMN012, 0) - COALESCE(COLUMN013, 0)) FROM OATABLE064 WHERE COLUMN002 = @BranchID AND COLUMN008 = @AccountID AND COLUMN007 >= @d AND COLUMN007 <= @AsOnDate RETURN COALESCE(@b1, 0) + COALESCE(@b2, 0)END Peter LarssonHelsingborg, Sweden |
 |
|
|
SwePeso
Patron Saint of Lost Yaks
30421 Posts |
Posted - 2007-05-14 : 07:59:43
|
Your fSubAccBalance function is fucked up!How can column sao.COLUMN004 be used BOTH for a date and for a subaccountid? SELECT @dblClBalance = ISNULL( -- Opening Balance from Opening Balance table (SELECT sao.COLUMN005 - sao.COLUMN006 FROM OATable044 ao, OATABLE045 sao WHERE ao.COLUMN001 = sao.COLUMN001 AND sao.COLUMN007 = @prmBranchId AND sao.COLUMN004 = @prmSubAccId AND CONVERT(CHAR(10),sao.COLUMN004,120) = @dtOpBalanceDate) ,0) + ... Peter LarssonHelsingborg, Sweden |
 |
|
|
sunsanvin
Master Smack Fu Yak Hacker
1274 Posts |
Posted - 2007-05-14 : 08:14:47
|
| GREATLet me check once againVinodEven you learn 1%, Learn it with 100% confidence. |
 |
|
|
|
|
|