2010-06-22 5 views
5

Я пытаюсь написать запрос MySQL, чтобы получить среднее значение в месяц за все месяцы между датами. Моя идея заключается в следующем:Выберите все месяцы в пределах заданного промежутка времени, в том числе с 0 значениями

запросов, что-то вроде

SELECT AVG(value1) as avg_value_1, 
AVG(value2) as avg_value_2, 
MONTH(save_date) as month, 
YEAR(save_date) as year 
FROM myTable 
WHERE save_date BETWEEN '2009-01-01' AND '2009-07-01' 
GROUP BY YEAR(save_date), MONTH(save_date) 

avg_value_1 | avg_value_2 | month | year 
    5  |  4  | 1 | 2009 
    2  |  1  | 2 | 2009 
    7  |  5  | 3 | 2009 
    0  |  0  | 4 | 2009 <--- 
    6  |  5  | 5 | 2009 
    3  |  6  | 6 | 2009 

Вы видите, значения не были введены в апреле 2009 года, но я хочу, чтобы показать, как 0, 0 значение выпуска продукции. Любые идеи о том, как достичь этого? Это можно сделать в MySQL?

ответ

6

Я согласен с ответом Ливена на создание таблицы, содержащей все месяцы, которые вы когда-либо могли потребовать, и используйте это для «LEFT JOIN» в таблице результатов. Помните, что это действительно крошечный стол, всего 365 (иш) строк в год данных, которые у вас есть ... И вы можете легко написать код для заполнения этой таблицы изначально

Мы делаем это здесь, и это дает много например, представьте себе ежемесячную таблицу данных со следующими полями (и любыми другими, о которых вы можете думать!), полностью заполненными за все месяцы в данном диапазоне;

  • Дата (Например 2009-04-01)
  • день (например, 1)
  • день недели (например, среда)
  • месяца (например, 4)
  • год (например, 2009)
  • финансовый год (например, 2009/10)
  • финансовый квартал (Eg 2009Q1)
  • Календарь Quarter (Например 2009Q2)

Затем, комбинируя это с вашим запросом выше, следующим образом;

 
SELECT `DT`.`myYear`, `DT`.`myMonth`, 
      AVG(`myTable`.`value1`) as avg_value_1, 
      AVG(`myTable`.`value2`) as avg_value_2 

FROM `dateTable` as DT 
LEFT JOIN `myTable` 
    ON `dateTable`.`myDate` = `myTable`.`save_date` 

WHERE `dateTable`.`myDate` BETWEEN '2009-01-01' AND '2009-07-01' 

GROUP BY `DT`.`myYear`, `DT`.`myMonth` 

Там могут быть некоторые ошибки в моем SQL кода, как я не был в состоянии создать таблицы тестов, но, надеюсь, вы получите основную и изменить, чтобы удовлетворить ваши потребности!

Используя это, вы можете изменить «GROUP BY» пункта к тому, что у вас есть в «dateTable» стол, который может позволить вам легко представить по финансовому кварталу, месяц, день, день недели и т.д.

Надеюсь, что это поможет!

2

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

+0

Спасибо за ваш ответ, но мне действительно нужна таблица, содержащая все возможные даты? Это не самый простой способ! :) –

+0

Трудно вернуть значения, которых не существует. :) –

+0

Хорошая точка Lieven, но MySQL знает обо всех датах наизусть, при использовании обычных GetDate() и DateAdd() и т. Д. Я просто чувствую, что должен быть способ их извлечения! –

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

  • Нет связанных вопросов^_^