2010-06-04 2 views
2

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

Мой текущий запрос выглядит следующим образом:

SELECT job_data_date, SUM(job_data_invoice_amount) as job_data_date_income 
FROM job_data 
WHERE job_data_date >= '2010-05-05' 
GROUP BY job_data_date 
ORDER BY job_data_date; 

Выход:

| job_data_date | job_data_date_income | 
| 2010-05-17  | 125      | 
| 2010-05-18  | 190      | 
| 2010-05-20  | 170      | 

Как видно из примера вывода 2010-05-19 не будет отображаться в результатах, потому что он никогда не был там хранится.

Есть ли способ показать даты, которые отсутствуют?

Спасибо,

Марат

+0

* Возможные дубликаты, по крайней мере связанные: * http://stackoverflow.com/questions/2501993/mysql-filling-in-missing-dates, http://stackoverflow.com/questions/2844486/mysql-to- fill-in-missing-date-when-use-group-by-datetable-timestamp-without, http://stackoverflow.com/questions/400759/sql-group-by-date-but-get-dates-wo- record-too –

ответ

1

Там нет никакого разумного способа сделать это, используя чистый SQL, на MySQL, по крайней мере, без создания таблицы с каждой датой когда-либо придуманной. Ваш лучший вариант - изменить приложение, использующее результаты этого запроса, для заполнения самих отверстий. Вместо того, чтобы отображать только полученные значения, постройте собственный набор значений с помощью простого цикла; подсчитывая один день за раз, заполняя значения из запроса, где бы они ни находились.

+1

Рекурсивные запросы предназначены для таких вещей, но MySQL не поддерживает синтаксис WITH :( –

2

Одна идея состоит в том, что у вас может быть таблица со всеми датами в ней, которые вы хотите показать, а затем выполнить внешнее соединение с этой таблицей.

Так что, если у вас была таблица с именем alldates с одной колонкой (job_data_date):

SELECT ad.job_data_date, SUM(job_data_invoice_amount) as job_data_date_income 
FROM alldates ad left outer join job_data jd on ad.job_data_date = jd.job_data_date 
WHERE ad.job_data_date >= '2010-05-05' 
GROUP BY ad.job_data_date 
ORDER BY ad.job_data_date; 

Обратной стороной является то, что вы должны держать эту таблицу населенной со всеми датами, которые вы хотите показать.

+0

Таблица NUMBERS более распространена - просто используйте DATE_ADD, чтобы получить свою дату на основе начальной точки, но вы правы - OP должен сгенерировать список дат и LEFT JOIN против него. –