按周分组,如何获得空周?

Dan*_*ilo 11 mysql sql group-by

我有以下代码,它们在几周内对一些事件(YYYY-MM-DD HH:MM:SS)进行分组,例如显示为"Y:2010 - Week:50".

SELECT DATE_FORMAT(date, 'Y:%X - Week:%V') AS regweek, COUNT(*) as number 
Run Code Online (Sandbox Code Playgroud)

它运作良好,但我希望返回所有周,即使没有发生任何事件.

如果在第三周没有注册任何事件,那么我得到:

week 1: 10
week 2: 1
week 4: 2
Run Code Online (Sandbox Code Playgroud)

我想得到:

week 1: 10
week 2: 1
week 3: 0
week 4: 2
Run Code Online (Sandbox Code Playgroud)

Lar*_*tig 8

SQL无法返回某些表中不存在的行.为了获得你想要的效果,你需要一个表Weeks(WeekNo INT),每年可能每周有一行(IIRC,可能是53或54周,具体取决于你的计算方式).

然后,使用OUTER JOIN将此表连接到常规结果,以便添加额外的周数.

SELECT DATE_FORMAT(date, 'Y:%X - Week:%V') AS regweek, COUNT(date) as number 
    FROM YourTable RIGHT OUTER JOIN Weeks ON WEEK(YourTable.date) = Weeks.WeekNo
Run Code Online (Sandbox Code Playgroud)

[更新]:注意COUNT(日期)的用户而不是COUNT(*).添加COUNT时,SQL不会在日期列中包含NULL值.由于缺失的周数将不会包含任何日期,因此这将在这几周正确地为您提供0个事件.