2015-11-05 141 views
0

我已经问过类似的问题,但我似乎仍然无法让我的头在附近。我有我的SQL数据库缺少范围mysql中的缺失值

2015-07-14 12:35:19 
2015-07-15 12:45:37 
2015-07-15 12:45:37 
2015-07-16 12:35:37 
2015-08-14 10:35:21 
2015-08-14 12:15:36 

我聚集在几个星期这些日期值的列DEVICE_CREATE_DATE,但也有在几个星期,在那里我想这些值刚好等于0,这样我可以主持人它们之间的遗漏值与其他指标在Excel表中。我创建了一个虚拟表“日期”来加入这些值,以便选择在没有值的情况下返回0。

这里是我使用的查询,

select date.year, week(device.device_create_date), count(*) 
from device 
join date 
on date.week_of_year=week(device.device_create_date) 
where device.id_customer = 1 
group by device.year, date.WEEK_OF_YEAR 
order by device.year, date.week_of_year; 

这是我回来后,

2010 26 7252 
2010 31 3108 
2010 45 7203 
2010 1 9324 
2010 2 7252 
2010 3 2072 

这是我希望它给我回什么;

2010 1 9324 
2010 2 7252 
2010 3 2072 
2010 4 0 
2010 5 0 
2010 6 0 
etc 

顺便说一句,这些值似乎没有被任何匹配的数据库上的算的,所以我有点知道我在做什么完全错误的,但我不伟大在这个所以任何帮助和指导将不胜赞赏。

预先感谢您!

+1

我们需要'device'的结构.. –

+1

在这种情况下使用正确的连接,而不是内部连接。此外,如果您有多年的数据,那么您需要在日期表中使用年份和星期,并加入两者。 – Shadow

回答

1

因为你总是希望从date表中的值(以获得所有可能的日期),并且从device匹配的行,你会想用date作为源,使用left joindevice表,因为一个inner join不仅会返回两个表中匹配的数据。

试试这个:

select date.year, date.week_of_year, count(device.device_create_date) 
from date 
left join device on date.week_of_year = week(device.device_create_date) 
       and device.id_customer = 1 
group by date.year, date.week_of_year 
order by date.year, date.week_of_year; 

如果您的表包含从一年以上的数据,你应该为一年多年添加条件的加入让你不要混用数据。

+0

这工作奇迹,非常感谢你jpw非常感谢,我发现错误以及你的评论后,而不是计数(*),计算设备创建日期。我15岁以下,所以我不能投你的评论,但它是完美的! –

+0

@NickKo如果你有'date'表中未来数年的数据,你需要添加一个过滤器来获得你想要的年份:'where date.year = 2015'。你应该添加'和date.year = year(device.device_create_date)'给连接。 – jpw

+0

我读了最后一个评论,回答了一下晚了,是的,现在一切正常,谢谢。 #竖起大拇指 –