PostgreSQL генерирует серии месяца и года на основе поля таблицы и заполняет нулями, если данные за данный месяц отсутствуют - PullRequest
0 голосов
/ 19 февраля 2019

Я хочу сгенерировать серию месяца и года от следующего месяца текущего года (скажем, start_month) до 12 месяцев с start_month вместе с соответствующими данными (если они есть, иначе вернуть нули) из другой таблицы вPostgreSQL.

SELECT ( ( DATE '2019-03-01' + ( interval '1' month * generate_series(0, 11) ) ) 
         ::  DATE ) dd, 
       extract(year FROM ( DATE '2019-03-01' + ( interval '1' month * 
                                                 generate_series(0, 11) ) 
                         )), 
       coalesce(SUM(price), 0) 
FROM   items 
WHERE  s.date_added >= '2019-03-01' 
       AND s.date_added < '2020-03-01' 
       AND item_type_id = 3 
GROUP  BY 1, 
          2 
ORDER  BY 2; 

Проблема с приведенным выше запросом заключается в том, что он дает мне одинаковое значение для price для всех месяцев.Требуется, чтобы столбец price был заполнен нулями или нулями, если для данного месяца нет данных price.

Ответы [ 2 ]

0 голосов
/ 19 февраля 2019

Поместите generate_series() в предложение FROM.Вы суммируете данные - то есть рассчитываете цену по всему диапазону - и затем проецируете это на все месяцы.Вместо:

SELECT gs.yyyymm,
       coalesce(SUM(i.price), 0) 
FROM generate_series('2019-03-01'::date, '2020-02-01', INTERVAL '1 MONTH'
                    ) gs(yyyymm) LEFT JOIN
     items i
     ON gs.yyyymm = DATE_TRUNC('month', s.date_added) AND
       i.item_type_id = 3 
GROUP BY gs.yyyymm
ORDER BY gs.yyyymm; 
0 голосов
/ 19 февраля 2019

Вы хотите generate_series в предложении FROM и присоединитесь к нему, что-то вроде

SELECT months.m::date, ...
FROM generate_series(
        start_month,
        start_month + INTERVAL '11 months',
        INTERVAL '1 month'
     ) AS months(m)
   LEFT JOIN items
      ON months.m::date = items.date_added
...