Выберите все месяцы в заданном диапазоне даты, в том числе с 0 значениями 0

StackOverflow https://stackoverflow.com/questions/3093924

  •  29-09-2019
  •  | 
  •  

Вопрос

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

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

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?

Это было полезно?

Решение

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

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

  • Дата (например, 2009-04-01)
  • День (например, 1)
  • День недели (например, среда)
  • Месяц (например, 4)
  • Год (например, 2009)
  • Финансовый год (например, 2009/10)
  • Финансовый квартал (например, 2009Q1)
  • Календарный квартал (например, 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 может возникнуть некоторые ошибки, так как я не смог создать тестовые таблицы, но, надеюсь, вы получите принципал и изменить в соответствии с вашими потребностями!

Используя это, вы можете изменить предложение «Группа по» тому, что у вас есть в таблице «DateTable», которая может позволить вам легко сообщать по финансовому кварталу, месяце, день, день недели и т. Д.

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

Другие советы

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top