SQL 日期部分(周),按年排序?

SQL Datepart (week), ORDER BY year?

我在这里使用以下查询来获取我的数据并每周显示值,但是,当有新的一年时,结果将显示周 50, 51, 52 of 2016 和周 1, 2, 3 of 2017,例如,它将 order by 周数导致 1,2,3,50,51,52 这意味着 2017 年的结果出现在 2016 年之前,我该如何更改它?

SELECT 
    DATEPART(wk, date) AS number,
    SUM((kg * rep * sett)) AS weight,
    SUM(kg / max * rep * sett) AS avg,
    SUM((rep * sett)) AS reps,
    MAX(kg / max) AS peak
FROM
    Test
WHERE
    date BETWEEN @0 AND @1 AND exercise < 4
GROUP BY DATEPART(wk, date)

您可以按年部分的总计添加订单:

SELECT 
    DATEPART(wk, date) AS number,
    SUM((kg * rep * sett)) AS weight,
    SUM(kg / max * rep * sett) AS avg,
    SUM((rep * sett)) AS reps,
    MAX(kg / max) AS peak
FROM
    Test
WHERE
    date BETWEEN @0 AND @1 AND exercise < 4
GROUP BY DATEPART(wk, date)
order by max(datepart(year,date)), number;

然而,以上将来自同一周数的数据汇总在一起,即使它们属于不同的年份(可能不是您想要的)。如果您想将不同年份的数据分开,您可以在输出中添加一个年份列。

SELECT 
    datepart(year,date) as year,
    DATEPART(wk, date) AS number,
    SUM((kg * rep * sett)) AS weight,
    SUM(kg / max * rep * sett) AS avg,
    SUM((rep * sett)) AS reps,
    MAX(kg / max) AS peak
FROM
    Test
WHERE
    date BETWEEN @0 AND @1 AND exercise < 4
GROUP BY datepart(year,date), DATEPART(wk, date)
order by year, number;

也许不是最优雅的解决方案,但您可以在分组依据的字段中包含年份:

SELECT 
    CONVERT(VARCHAR,DATEPART(year, date)) + '_' + CONVERT(VARCHAR,DATEPART(wk, date)) AS Year_Week,
    SUM((kg * rep * sett)) AS weight,
    SUM(kg / max * rep * sett) AS avg,
    SUM((rep * sett)) AS reps,
    MAX(kg / max) AS peak
FROM
    Test
WHERE
    date BETWEEN @0 AND @1 AND exercise < 4
GROUP BY CONVERT(VARCHAR,DATEPART(year, date)) + '_' + CONVERT(VARCHAR,DATEPART(wk, date))
ORDER BY CONVERT(VARCHAR,DATEPART(year, date)) + '_' + CONVERT(VARCHAR,DATEPART(wk, date))

或者(可能更好),将它们视为完全独立的字段:

SELECT 
    DATEPART(year, date) AS Year,
    DATEPART(wk, date) AS Week,
    SUM((kg * rep * sett)) AS weight,
    SUM(kg / max * rep * sett) AS avg,
    SUM((rep * sett)) AS reps,
    MAX(kg / max) AS peak
FROM
    Test
WHERE
    date BETWEEN @0 AND @1 AND exercise < 4
GROUP BY DATEPART(year, date), DATEPART(wk, date)
ORDER BY DATEPART(year, date), DATEPART(wk, date)