2015-11-03 4 views
2

Я просто застрял в этой проблеме, и я не уверен на 100%, как с этим бороться.Отсутствующие значения для count в mysql

У меня есть таблица, где я агрегирования данных на неделю

select week(create_date),count(*) 
from user 
where create_date > '2015-02-01' 
and id_customer between 9 and 17 
group by week(create_date); 

результаты, которые я получаю имеют пропущенные значения в счете, как показано ниже

5 334 
6 376 
7 394 
8 405 
9 504 
10 569 
11 709 
12 679 
13 802 
14 936 
15 1081 
16 559 
21 1 
24 9 
25 22 
26 1 
32 3 
34 1 
35 1 

Например здесь от 16 до 21 там, очевидно, 4 значения отсутствуют. Я бы хотел, чтобы эти значения были включены и считались равными 0. Я хочу это, потому что я хочу, чтобы недели соответствовали другим метрикам, когда мы выводим их в файл excel для внутреннего анализа ,

Любая помощь была бы принята с благодарностью.

ответ

1

Проблема заключается в том, что SQL-запрос не может действительно создавать данные, которых нет вовсе.

У вас есть 3 варианта:

  1. Если у вас есть данные за каждую неделю во всей вашей таблице на период вы запрашиваете, то вы можете использовать автообъединение, чтобы получить недостающие недели:

    select week(t1.create_date), count(t2.id_customer) from customer t1 left join customer t2 on t1.id_customer=t2.id_customer and t1.create_date=t2.create_date and t2.id_customer between 9 and 17 where t1.create_date > '2015-02-01' group by week(t1.create_date)

  2. Если у вас есть недостающие недели из таблицы клиента в целом, а затем создать вспомогательную таблицу, содержащую номер недель от 1 или 0 (в зависимости от тузда конфигурации) до 53 и сделать левый присоединиться к этим хелперам столу.

  3. Используйте хранимую процедуру, которая проходит через результаты вашего исходного запроса и вставляет отсутствующие данные в наборе результатов с помощью временной таблицы, а затем возвращает расширенный набор данных в качестве результата.

+0

Это было очень подробное объяснение довольно прямолинейно отсюда, я думаю, так как есть недостающие значения, я пойду вперед и создаю эту вспомогательную таблицу u, предлагаемую, и тогда она должна взять направление. Еще раз спасибо, очень ценим. –

+0

Ребята, если первый день не хватает, то есть на первую неделю будет 5, какое лучшее решение, чтобы оно начиналось с первой недели? –

+0

Я не понимаю ваш вопрос. Первый день отсутствует, откуда? С чего вы хотите начать: неделю 1 или 5? – Shadow

1

Проблема в том, что нет данных, соответствующих вашим критериям для недостающих недель. Решение состоит в том, чтобы присоединиться к таблице, содержащей все номера недели. Например, если вы создаете таблицу с одной номером неделю поля НомерНедели, содержащей все числа от 0 до 53 вы можете использовать что-то вроде этого

select weeknumber,count(user.*) 
from weeknumbers left join user on (weeknumbers.weeknumber=week(user.create_date) 
and user.create_date > '2015-02-01' 
and user.id_customer between 9 and 17) 
group by weeknumber; 

Additionaly вы можете ограничить неделю номер вы не хотите видеть. Другой способ - сделать это в приложении.

+0

Большое спасибо, я рассматривал этот вариант через кабинетное исследование, но теперь у меня лучшее направление. #thumbsup –

Смежные вопросы