我有以下代码,它们在几周内对一些事件(YYYY-MM-DD HH:MM:SS)进行分组,例如“Y:2010 - Week:50”。
SELECT DATE_FORMAT(date, 'Y:%X - Week:%V') AS regweek, COUNT(*) as number
它运作良好,但我希望返回所有周,即使没有发生任何事件的那些。
如果在第三周没有注册任何事件,那么我得到:
week 1: 10
week 2: 1
week 4: 2
我想得到:
week 1: 10
week 2: 1
week 3: 0
week 4: 2
答案 0 :(得分: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
[更新]:注意COUNT(日期)的用户而不是COUNT(*)。添加COUNT时,SQL不会在日期列中包含NULL值。由于缺失的周数将不会包含任何日期,因此这将在这几周正确地为您提供0个事件。
答案 1 :(得分:1)
最后,我决定按照以下方式解决问题,创建一个周的临时表,并使用上面答案中找到的代码。
CREATE TEMPORARY TABLE weeks (
id INT
);
INSERT INTO weeks (id) VALUES (0), (1), (2), (3), (4), (5), (6), (7), (8), (9), (10), (11), (12), (13), (14), (15), (16), (17), (18), (19), (20), (21), (22), (23), (24), (25), (26), (27), (28), (29), (30), (31), (32), (33), (34), (35), (36), (37), (38), (39), (40), (41), (42), (43), (44), (45), (46), (47), (48), (49), (50), (51), (52), (53), (54);
SELECT
w.id, COUNT(c.issuedate) as numberPerWeek
FROM tableName c RIGHT OUTER JOIN weeks w ON WEEK(c.issuedate) = w.id group by w.id;
答案 2 :(得分:0)
这是制作数字/计数表的问题 - 只是一个从0到任何数字的简单表。它们通常很有用,我总是建议将它们添加到您的数据库中。
通过这种方式,您可以相对轻松地生成动态周列表而无需特定的预先计算的周表(因此您不需要大表或担心数周用完),然后离开加入根据您的约会列表显示所有周的约会。
快速入门:
declare @min datetime
set @min ='2010-01-01'
select
dateadd(wk, number, @min) as weekDate
from
numbers
where
number between 0 and datediff(wk,@min,getdate())
与