2015-11-05 9 views
0

Я уже задал аналогичный вопрос, но, похоже, я все еще не могу его обогнуть. У меня есть столбец device_create_date на моих базах данных 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 

Я агрегационный эти значения даты в неделях, но есть пропущенные значения в период между неделей, где я хочу, чтобы эти ценности просто равен 0, так что я могу конферансье~d их с другими метриками на листе 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

use right join в этом случае, а не внутреннее соединение. Плюс, если у вас многолетние данные, вам нужно использовать год и неделю в таблице даты и присоединиться к обоим. – Shadow

ответ

1

Поскольку вы всегда хотите значения из date таблицы (чтобы получить все возможные даты) и совпадающие строки из device вы хотите использовать date в качестве источника и использовать left join с device столом так как 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 за его высокую оценку, я заметил ошибку, а также после вашего комментария, вместо count (*), подсчитайте дату создания устройства. Мне меньше 15, поэтому я не могу проголосовать за ваш комментарий, но это было прекрасно! –

+0

@NickKo Если у вас есть данные для предстоящих лет в таблице «date», вам нужно добавить фильтр, чтобы получить только год, который вы хотите: 'where date.year = 2015' например. Вероятно, вы должны добавить 'и date.year = year (device.device_create_date)' для соединения. – jpw

+0

Я прочитал последний комментарий в ответе немного позже, да, сейчас все отлично работает, спасибо. #пальцы вверх –