PostgreSQL根据表字段生成月份和年份系列,如果没有给定月份的数据则填充空值

我希望从当前年的下个月(比如start_month)到start_month的12个月以及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列将填充空值或零。

0
投票

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
投票

你想在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