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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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列将填充空值或零。

答案

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; 
另一答案

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

以上是关于PostgreSQL根据表字段生成月份和年份系列,如果没有给定月份的数据则填充空值的主要内容,如果未能解决你的问题,请参考以下文章

根据月份和年份订购交叉选项卡查询

在数据库中,如果只需要年份和月份,您会使用日期字段还是年份和月份字段?

在MySql中、怎样根据年份或者月份查询数据表中的数据?

根据月份和年份过滤对象数组

PostgreSQL TO_CHAR() 删除月份字段的填充

如何根据年份和月份进行排名?