• Here is the first part and the goal of this part is to improve the yearweek table which then allows us to do a direct join to it rather than using string functions in the join definition.

    😎

    USE TESTDB;

    GO

    IF EXISTS (SELECT OBJECT_ID(N'dbo.yearweek'))

    BEGIN

    DROP TABLE dbo.yearweek;

    END

    /*

    First suggestion, change the structure of the dbo.yearweek table, adding

    a clustered index, a computed column and finally an unique covering

    index for the query.

    */

    CREATE TABLE dbo.yearweek(

    yrwk VARCHAR(6) NOT NULL CONSTRAINT PK_DBO_YEARWEEK_YRWK PRIMARY KEY CLUSTERED

    ,yr INT NOT NULL

    ,wk INT NOT NULL

    ,rn INT NOT NULL

    ,weekx AS (CONVERT( VARCHAR(9),((('W '+CONVERT([char](4),[yr]))+' ')

    +stuff('00',(3)-len(CONVERT([char](2),[wk]))

    ,len(CONVERT([char](2),[wk]))

    ,CONVERT([char](2),[wk]))),1)) PERSISTED

    ) ON [PRIMARY];

    GO

    /* Unique covering index */

    CREATE UNIQUE INDEX UNQIDX_DBO_YEARWEEK_WEEKX ON dbo.yearweek (weekx ASC)

    INCLUDE (yr,wk,rn);

    GO

    /* Populate the table */

    DECLARE @startyr as INT

    DECLARE @no_yrs as INT

    SET @startyr = 2010

    SET @no_yrs = 20

    ;WITH T(N) AS (SELECT N FROM (VALUES (NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL)) AS X(N))

    ,YEAR_NUMS(N) AS (SELECT TOP(@no_yrs) ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) -1 AS N FROM T T1,T T2, T T3 ,T T4, T T5, T T6, T T7)

    ,WEEK_NUMS(N) AS (SELECT TOP(52) ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) -1 AS N FROM T T1,T T2, T T3 ,T T4, T T5, T T6, T T7)

    INSERT INTO dbo.yearweek (yrwk,yr,wk,rn)

    SELECT

    CAST(a.yearno + b.dayno as VARCHAR(6)) AS yrwk

    ,CAST(a.yearno AS INT) AS yr

    ,CAST(b.dayno AS INT) AS wk

    ,CONVERT(INT,ROW_NUMBER() OVER (ORDER BY a.yearno, b.dayno),0) AS rn

    FROM

    (SELECT CAST(@startyr + N AS VARCHAR) AS yearno FROM YEAR_NUMS)AS a

    CROSS JOIN

    (SELECT (CASE WHEN N < 10 THEN '0' + CAST(N AS VARCHAR) ELSE CAST(N AS VARCHAR) END ) AS dayno FROM WEEK_NUMS)AS b

    /* Check the content */

    SELECT

    *

    FROM dbo.yearweek;

    BTW: My apologies for the late and piecemeal like answer:-)