[x]
Posted via EE Mobile

Search, ask, and monitor your questions on the go with EE Mobile. Visit Experts Exchange from your mobile device and never be out of touch again.

Question
[x]
Attachment Details
[x]
The Solution Rating System

With so many solutions, how can you tell which solutions are most likely to help you and which ones are not? To provide you with a tool to use, we rate our solutions based on various elements that most accurately determine if a solution is a quality solution. To explain what factors affect the solution rating, here are the elements we take into consideration when formulating our solution rating.

  • The Grade of the Solution
  • The Zone Rank of the Expert Providing the Solution
  • The Number of Author and Expert Comments
  • The Number of Experts Contributing
  • The Feedback of the Community

Your Input Matters
Because of the way the system is set up, the most important variable in this equation is you. As a member of Experts Exchange, you are able to cast your vote on the quality of the solutions in regard to how complete, accurate, helpful and easy to understand each solution is. When you provide your feedback, each rating is adjusted accordingly. So, if you see a solution that has a poor rating that you think is a good solution, let us know by rating it. As you do, the rating will be adjusted and will become more accurate for other members of our site.

If you have any suggestions that you would like to make for our rating system, please ask a question in the Suggestions Zone of Community Support.

Thank you!

8.2

Making Cursor/Fetch more efficient

Asked by sspeedy00 in SQL Reporting, MS SQL Reporting, MS SQL Server

Tags: cursor, fetch, while, loops, looper

Hi Everyone,

Got a lot of help earlier, but I'm still working on this.  I'll be posting two code pieces.  One will be the original stored proc., the second will be mine, trying to improve on the cursor and fetches!  Not by any means claiming mine is that much better, because it is still using a while loop, but I think it is better than using a cursor to loop through.  

Oh, yeah, so my improved version isn't working properly.  With original sp, here are the results (i'm only showing the rows that matter):
weeks   hours_already_worked
41          75
42          75
39          75
40          75

With mine, here are the results:
41      67.5
42      45
39      60
40      52.5

So you are welcome to suggest a better alternative to even mine, but I need a complete solution.  If someone can help me spot what I'm doing wrong with my stored proc., that'd be awesome.  I appreciate any help.
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
160:
161:
162:
163:
164:
165:
166:
167:
168:
169:
170:
171:
172:
/* THIS IS ORIGINAL SP!!! */
ALTER PROCEDURE [dbo].[CalculateSomeAwefulStuff]
@SSN char(9),
@currentPayrollDate smalldatetime,
@std_hours float
 AS
 
Declare @Hours float
Declare @Work_Date smalldatetime
 
Declare looper CURSOR SCROLL
  FOR SELECT CONVERT( decimal, hrs_Worked ) + ( CONVERT( decimal ,mins_Worked ) / 60)  + ( dbo.workDayPercentageStringToDecimal(  Work_Day_Percentage )  * (@std_hours/5) ) AS Hours,
             Date_Worked
  FROM tblRecord
		WHERE Finalized = 1
                   		AND SSN = @SSN
                   		AND pay_cycle_date = @currentPayrollDate
			AND Time_Code IN ( 'O', 'D', 'N', 'R' )
 
Declare @temp float
SET @temp = 0
 
Open looper
 Fetch First From looper
              INTO @Hours, @Work_Date
 
 While @@Fetch_Status = 0  ------------------LOOP 
   BEGIN
	print @Hours
	print datepart( week, @Work_Date )
	print @Work_Date
 
	SELECT @temp = COUNT(*) FROM tblACRWeekHours_temp
	WHERE week = datepart( week, @Work_Date )
 
	IF @temp <= 0
	  BEGIN
		INSERT INTO tblACRWeekHours_temp( week, hours_already_worked ) 
		VALUES(  datepart( week, @Work_Date ),  @Hours + @std_hours )
	  END
	ELSE
	  BEGIN
		SELECT @temp = hours_already_worked
		FROM tblACRWeekHours_temp
		WHERE week = datepart( week, @Work_Date )
 
		UPDATE tblACRWeekHours_temp 
		  SET hours_already_worked = @temp + @Hours
		  WHERE week = datepart( week, @Work_Date )
	  END
 
	Fetch Next from looper INTO @Hours, @Work_Date
   END -----------------------------------------------------END LOOP
 
 
CLOSE looper
DEALLOCATE looper
 
/********************************************************************************************************/
 
/* Here's my version of the same thing, to improve some speed. I'd like to eliminate my while loop altogether.  Either way, my results are not correct, so what am I doing wrong? */
 
ALTER PROCEDURE [dbo].[CalculateHoursAlreadyWorkedThisCycleDuplicate]
@SSN char(9),
@currentPayrollDate smalldatetime,
@std_hours float
 
AS
 
begin
 
Declare @Hours float
Declare @Work_Date smalldatetime
 
/* if temp. table exists, delete it to avoid problems */
IF OBJECT_ID('temp..#temp_table') IS NOT NULL
begin
DROP TABLE #temp_table 
end
 
/* create main temp. table */
CREATE	TABLE	#tblACRWeekHours_temp 
( 
	ssn char(9),
	division char(2), 
	pay_sect char(3), 
	currentPayrollDate datetime,
	week int,
	hours_already_worked float,
	_1_0_hrs float,
	_1_5_hrs float,
	_2_0_hrs float,
	_diff_hrs float,
	_eper_hrs float,
	addnl_money float,
	work_location int
)
 
/* create a temp. table to hold the values, instead of using a CURSOR/loop
   like in orign. stored proc */
CREATE	TABLE #temp_table 
( 
	
	hours float, 
	date_worked datetime
	
)
 
 
/*store everything here ahead of time.
 *fetch the hours and date_worked
 *To get the hours, use same formula as orgin. stored proc.
 *same query as in last orig. proc. */
INSERT INTO #temp_table(hours, date_worked)
SELECT	CONVERT( decimal, hrs_worked) + ( CONVERT( decimal ,mins_worked ) / 60)  
								+ ( dbo.workDayPercentageStringToDecimal(  Work_Day_Percentage )  * (37.5/5) ), Date_Worked
 
						FROM	tblRecord
 
						WHERE Finalized = 1
                   				AND SSN = @SSN
                   				AND pay_cycle_date = @currentPayrollDate
						AND Time_Code IN ( 'O', 'D', 'N', 'R' )
 
 
 
/*looping is ugly but we might have to end up with it here*/
DECLARE @counter int; /* counter for while loop */
DECLARE @i int; /* increment with @i */
set @i = 0;
SELECT @counter = count(*) from #temp_table
 
 
/* The idea with the while loop here is:
   Grab the top 1 result from #temp_table. After we are doing what we need with this row,
   delete it from #temp_table. Then adjust the @counter and @i values at end of while loop.
   Something is going wrong here...
*/
WHILE @i < @counter
begin
 
SET		@Work_Date = (select top 1 date_worked from #temp_table)
SET		@Hours = (select top 1 hours from #temp_table)
 
 
--calc week here instead of re-using it directly
DECLARE @week int
SET @week = DATEPART(week, @Work_Date)
 
IF NOT EXISTS(SELECT * FROM #tblACRWeekHours_temp WHERE week = @week)
BEGIN
	INSERT INTO #tblACRWeekHours_temp( week, hours_already_worked )
	SELECT TOP 1	@week, hours + @std_hours
			
	FROM			#temp_table
 
END
ELSE
BEGIN
 
	UPDATE #tblACRWeekHours_temp 
	SET  hours_already_worked = hours_already_worked  + @Hours
						
	WHERE week = @week
 
	
END
 
delete from #temp_table where date_worked = @Work_Date
set @counter = @counter - 1;
set @i = @i + 1;
end
[+][-]08/25/09 10:15 AM, ID: 25179818Assisted Solution

Assisted solutions are selected by the member who asked the question as a comment that contributed to their question's solution.

Start your 30-day free trial to view this Assisted Solution or ask the Experts your question.

 
[+][-]08/25/09 11:30 AM, ID: 25180650Author Comment

Often, when Experts are collaborating with members who have asked questions, they will request additional information about the problem. Askers respond with an author comment like this one.

Start your 30-day free trial to view this Author Comment or ask the Experts your question.

 
[+][-]08/27/09 12:32 PM, ID: 25201765Accepted Solution

View this solution now by starting your 30-day free trial. Setting up your free trial is quick, easy, and secure. We will return you to this solution, unlocked, when you're done.

About this solution

Zones: SQL Reporting, MS SQL Reporting, MS SQL Server
Tags: cursor, fetch, while, loops, looper
Sign Up Now!
Solution Provided By: sspeedy00
Participating Experts: 1
Solution Grade: A
 
[+][-]08/27/09 12:34 PM, ID: 25201782Author Comment

Often, when Experts are collaborating with members who have asked questions, they will request additional information about the problem. Askers respond with an author comment like this one.

Start your 30-day free trial to view this Author Comment or ask the Experts your question.

 
 
Loading Advertisement...
20091021-EE-VQP-81 - Hierarchy / EE_QW_3_20080625