Reputation: 15
How to add to the query a list of names for each week from another table with names (repeat in order by id)
Weeknumb
is different from id
SELECT DATEPART(wk,DATEADD(wk,t2.number,'2019')) as Weeknumb
, DATEADD(wk, DATEDIFF(wk, 4, '01/01/' + '2019')
+ (DATEPART(wk,DATEADD(wk,t2.number,'2019'))-1), 4) AS StartOfWeek
, DATEADD(wk, DATEDIFF(wk, 4, '01/01/' + '2019')
+ (DATEPART(wk,DATEADD(wk,t2.number,'2019'))-1), 11) AS EndOfWeek
FROM master..spt_values t2
WHERE t2.type = 'P'
AND t2.number <= 255
AND YEAR(DATEADD(wk,t2.number,'2019'))=2019
Result:
| Weeknumb | StartOfWeek | EndOfWeek |
|----------|----------------------|----------------------|
| 1 | 2019-01-04T00:00:00Z | 2019-01-11T00:00:00Z |
| 2 | 2019-01-11T00:00:00Z | 2019-01-18T00:00:00Z |
| 3 | 2019-01-18T00:00:00Z | 2019-01-25T00:00:00Z |
| 4 | 2019-01-25T00:00:00Z | 2019-02-01T00:00:00Z |
| 5 | 2019-02-01T00:00:00Z | 2019-02-08T00:00:00Z |
| 6 | 2019-02-08T00:00:00Z | 2019-02-15T00:00:00Z |
| 7 | 2019-02-15T00:00:00Z | 2019-02-22T00:00:00Z |
| 8 | 2019-02-22T00:00:00Z | 2019-03-01T00:00:00Z |
| 9 | 2019-03-01T00:00:00Z | 2019-03-08T00:00:00Z |
| 10 | 2019-03-08T00:00:00Z | 2019-03-15T00:00:00Z |
| 11 | 2019-03-15T00:00:00Z | 2019-03-22T00:00:00Z |
I have another table with names
| id | name |
|----|------|
| 1 | a |
| 2 | b |
| 3 | c |
Need to be:
| Weeknumb | StartOfWeek | EndOfWeek | Name
|----------|----------------------|----------------------|-------
| 1 | 2019-01-04T00:00:00Z | 2019-01-11T00:00:00Z | a
| 2 | 2019-01-11T00:00:00Z | 2019-01-18T00:00:00Z | b
| 3 | 2019-01-18T00:00:00Z | 2019-01-25T00:00:00Z | c
| 4 | 2019-01-25T00:00:00Z | 2019-02-01T00:00:00Z | a
| 5 | 2019-02-01T00:00:00Z | 2019-02-08T00:00:00Z | b
| 6 | 2019-02-08T00:00:00Z | 2019-02-15T00:00:00Z | c
| 7 | 2019-02-15T00:00:00Z | 2019-02-22T00:00:00Z | a
| 8 | 2019-02-22T00:00:00Z | 2019-03-01T00:00:00Z | b
| 9 | 2019-03-01T00:00:00Z | 2019-03-08T00:00:00Z | c
| 10 | 2019-03-08T00:00:00Z | 2019-03-15T00:00:00Z | a
| 11 | 2019-03-15T00:00:00Z | 2019-03-22T00:00:00Z | b
Upvotes: 1
Views: 78
Reputation: 9083
Is this what you had in mind :
select a.Weeknumb
, a.StartOfWeek
, a.EndOfWeek
, b.name from (
SELECT case when ((ROW_NUMBER() OVER (ORDER BY DATEPART(wk,DATEADD(wk,t2.number,'2019'))) % (select count(1) from testTable2))) = 0 then 3
else ((ROW_NUMBER() OVER (ORDER BY DATEPART(wk,DATEADD(wk,t2.number,'2019'))) % (select count(1) from testTable2)))
end br
, DATEPART(wk,DATEADD(wk,t2.number,'2019')) as Weeknumb
, DATEADD(wk, DATEDIFF(wk, 4, '01/01/' + '2019') + (DATEPART(wk,DATEADD(wk,t2.number,'2019'))-1), 4) AS StartOfWeek
, DATEADD(wk, DATEDIFF(wk, 4, '01/01/' + '2019') + (DATEPART(wk,DATEADD(wk,t2.number,'2019'))-1), 11) AS EndOfWeek
FROM master..spt_values t2
WHERE t2.type = 'P'
AND t2.number <= 255
AND YEAR(DATEADD(wk,t2.number,'2019'))=2019) a
left join ( select ROW_NUMBER() OVER (ORDER BY id ) rn, name from testTable2)b
on (a.br = b.rn)
Here is the DEMO
Upvotes: 1
Reputation: 7739
You can accomplish this using a database join.
https://learn.microsoft.com/en-us/sql/relational-databases/performance/joins?view=sql-server-ver15
You can join on the results of a SQL query as well as on a table:
SELECT t1.a, t2.b
FROM (
SELECT id, a
FROM table1
) t1
LEFT JOIN table2 t2 ON t2.id = t1.id
Upvotes: 0