【问题标题】:SQL Datepart (week), ORDER BY year?SQL Datepart(周),按年排序?
【发布时间】:2017-02-02 17:19:47
【问题描述】:

我在这里使用以下查询来获取我的数据并每周显示值,但是,当有新的一年并且结果将显示星期 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)

【问题讨论】:

  • 您的查询不包含 order by 子句...
  • 我应该订购什么?因为日期不起作用:/ @ZoharPeled
  • 这取决于可能的@0 AND @1 span。它可以跨越 2015 年 1 月到 2017 年 1 月,因此您想要什么?
  • 您应该将 datepart(year) 添加到 group by,select 和 order by 子句应该包含两个日期部分。
  • 它应该按年份排序,即使是多个星期数 5,例如 @Serg

标签: sql sql-server datepart


【解决方案1】:

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

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)

【讨论】:

  • 在你的最后一个例子中给了我这个错误There was an error parsing the query. [ Token line number = 1,Token line offset = 37,Token in error = DATEPART ]!那会是什么?
  • 您在使用 SQL Server Management Studio (SSMS) 吗?
  • Sql server 压缩版
  • @Serg 谢谢,已更正。对错误的 SQL Compact 版本感到困惑 - 如果它是通过 SSMS 运行的,可能已经识别出Incorrect syntax near 'DATEPART'.。 :)
  • 哈哈完全错过了那个逗号!感谢您的帮助,这很好用!真的很感激!
【解决方案2】:

您可以按年份合计添加订单:

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;

【讨论】:

  • 如果不同年份的记录在各自年份的同一周出现,这是否仍会将它们组合在一起?
猜你喜欢
  • 2023-03-13
  • 1970-01-01
  • 2020-10-16
  • 2015-05-13
  • 2015-12-17
  • 2023-04-08
  • 2019-11-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多