从当年的周数中减去 N

Subtract N from weeknum of current year

我们有 table WeeklyResults 看起来像这样:

Year    WeekNum   Value
2021    47        11.0
2021    48        14.0
2021    49        12.0
2021    50        17.0
2021    51        11.8
2021    52        11.3
2021    53        11.1
2022    01        11.5
2022    02        11.5  
2022    03        81.5  

我们有一个包含两个参数的报表:Date 和 WeekNum。报告需要根据所选周数显示过去 6 周。

问题是,如果用户选择 2022 年的第 2 周,我如何减去 6 周以便得到 2021 年的第 50、51、52、53 周和 2022 年的第 1、2 周?

因此,如果用户选择 2022第 02 周,它将显示基于 2022 年第 2 周的最后 6 周(第 50 周到第 02 周)。如果用户选择 2021 和 52,它将显示 wk47-52。

您可以在 TOPORDER BY 旁边使用一些 <<= 逻辑来实现此目的:

DECLARE @Year int = 2022, 
        @WeekNum int = 3; --Note, if you are storing WeekNum as a (var)char,
                          --your leading zeros imply you are, then define the
                          --variable as a char(2).

SELECT TOP (6)
       [Year],
       WeekNum,
       [Value]
FROM dbo.YourTable
WHERE ([Year] = @Year AND WeekNum <= @WeekNum)
   OR [Year] < @Year
ORDER BY [Year] DESC,
         WeekNum DESC;

试试这个:

DECLARE @Year       int         =   2022
    ,   @WeekNum    varchar(02) =   '02'
;

WITH FinalTable AS
    (
        SELECT  TOP 6 *
        FROM    WeeklyResults
        ORDER BY LTRIM(Year) + WeekNum DESC
    )

SELECT *
FROM    FinalTable  
ORDER BY Year, WeekNum

另一个不涉及 ORDER BY 的选项。使用 DATEPART 您可以确定前一年的最后一周并减去周数以获得所需的记录。

您可能需要调整星期几作为计数的第一天。有关详细信息,请参阅此

DECLARE
    @Year INT = 2022
    , @WeekNum INT = 3;

SELECT
    *
FROM
    WeeklyResults
WHERE
    Year = @Year
    AND WeekNum <= @WeekNum
    OR
        (
            @WeekNum < 6
            AND Year = @Year - 1
            AND WeekNum > DATEPART (WEEK, CONCAT ('12/31/', @Year - 1)) - @WeekNum
        );