按年为一年的MySQL分组

时间:2016-01-04 15:28:50

标签: mysql sql

我需要一周一周的订单统计数据,所以我这样做了:

SELECT YEAR(orders.date), WEEKOFYEAR(orders.date), COUNT(*)
FROM orders 
GROUP BY YEAR(orders.date), WEEKOFYEAR(orders.date)

它工作了一年,但就在现在(新的一年)它不计算第53周的最后几天(1月1日,2日,3日)。如何更新我的查询以便在上周(从2015-12-28周一到周日2016-01-03)完整填写?

3 个答案:

答案 0 :(得分:2)

您需要切换到YEARWEEK(orders.date,3)才能将ISO周作为单个列。使用WEEK(orders.date,3)(与WEEKOFYEAR完全相同)将返回正确的周数,但YEAR(orders.date)将返回2015年或2016年,将本周分为2015年的4天和3 2016年的几天。

答案 1 :(得分:1)

正如草莓在评论中提到的那样,您正在寻找WEEK功能。我刚查看了MySQL网站上的文档。

周(日期[,模式])

  

此函数返回日期的周数。 WEEK()的双参数形式使您能够指定周是在星期日或星期一开始,以及返回值是否应该在0到53或1到53的范围内。如果省略mode参数,则值使用default_week_format系统变量

这是一个例子

SELECT WEEK('2008-12-31',1);
=> 53

还应注意,这与WEEKOFYEAR函数不同。

  

1到53 的范围内的数字返回日期的日历周。 WEEKOFYEAR()是一个兼容函数,相当于 WEEK(date,3)

我们可以看到mode参数的值是3.这是显示模式值的表

Mode First day of week  Range   Week 1 is the first week
0    Sunday             0-53    With a Sunday in this year
1    Monday             0-53    With 4 or more days this year
2    Sunday             1-53    With a Sunday in this year
3    Monday             1-53    With 4 or more days this year
4    Sunday             0-53    With a Sunday in this year
5    Monday             0-53    With 4 or more days this year
6    Sunday             1-53    With a Sunday in this year
7    Monday             1-53    With 4 or more days this year

来源

https://dev.mysql.com/doc/refman/5.0/en/date-and-time-functions.html#function_week

答案 2 :(得分:0)

据我了解,您希望计算一周的总订单一次,而不是两年不会两次。

我已经为SQL Server编写了SQL查询,但我认为你可以轻松地在mysql上重写它。

DECLARE @test_table TABLE(created_date DATETIME, VALUE INT)

INSERT INTO @test_table
SELECT N'20151231', 10
UNION ALL
SELECT N'20151228', 20
UNION ALL
SELECT N'20160101', 40
UNION ALL
SELECT N'20160104', 5
UNION ALL
SELECT N'20160107', 2

SELECT first_day_week_number,
       SUM(value) AS total 
FROM
    (SELECT *,
           DATEPART(ww, 
                    DATEADD(dd, -DATEPART(dw, created_date)+2, created_date)) AS first_day_week_number
    FROM @test_table ) AS T
GROUP BY first_day_week_number

为了避免多年的问题,您可以计算订单日期的第一周工作日,然后从中获取周数。