question

JTrafton avatar image
JTrafton asked

using results of cte (common table expression) in a query

DECLARE @year date = dateadd(year, datediff(year, 0, '2017-01-01'), 1);
 WITH weeks(WeekNumber) AS
 (
 SELECT 0
 UNION ALL
 SELECT WeekNumber + 1 
 FROM weeks
 WHERE WeekNumber < 51
 )
SELECT  dateadd(week, WeekNumber, @year) FROM weeks AS WorkWeek 

The payday is each monday of the week, the results of this cte is returning those dates for the year I have attemptd to write the results of this cte to a temp table:

declare @tempTable table(WeekNumber date)
DECLARE @year date = dateadd(year, datediff(year, 0, '2017-01-01'), 1);
 WITH weeks(WeekNumber) AS
 (
 SELECT 0
 UNION ALL
 SELECT WeekNumber + 1 
 FROM weeks
 WHERE WeekNumber < 51
 )
 insert into @tempTable
SELECT  dateadd(week, WeekNumber, @year) FROM weeks AS WorkWeek 

I have the following query, where I want to user the values from @tempTable

select hrlyrate, reghrs, othrs from tableb
where loginId in (select distinct empid from tableb where workday between date and '2017-12-31'
and payday > '2017-01-01'
note: where date is an iteration of the dates returned from the query select * from @tempTable
I have tried using a while loop to no avail. Is there a better way to get this information and to perform the query?
ctetemporary-table
4 comments
10 |1200

Up to 2 attachments (including images) can be used with a maximum of 512.0 KiB each and 1.0 MiB total.

Oleg avatar image Oleg commented ·

@JTrafton The CTE is completely wrong, it just accidentally happens to work for 2017 because in 2017 January 2nd happened to be Monday. If you use any other year then it might not return the set of all Mondays. The variable named year (the way it is declared) will always return January 2nd of whatever date is passed as the third parameter to the datediff. For example, if you pass 2018-01-01 then your CTE will return 52 records: Jan 2, Jan 9, Jan 16 of 2018, but these days are NOT Mondays, they are Tuesdays.

Additionally, you are using recursive CTE to get the set of dates. Why do you do that? It does not make any sense whatsoever to use the recursive CTE for something this simple. Please clarify whether you need the list of Mondays for any given year or not. By the way, some years will have 53 Mondays, not 52.

Thank you.

1 Like 1 ·
ThomasRushton avatar image ThomasRushton ♦♦ commented ·

CROSS APPLY? JOIN?

0 Likes 0 ·
JTrafton avatar image JTrafton commented ·

Thanks, Oleg for the response, I have replaced the CTE with a query to get the Mondays in any given year

0 Likes 0 ·
Show more comments

0 Answers

·

Write an Answer

Hint: Notify or tag a user in this post by typing @username.

Up to 2 attachments (including images) can be used with a maximum of 512.0 KiB each and 1.0 MiB total.