oracle 数据按月份分类,并求其中某项值的总和

最近遇到一个数据库查询问题,需要按指定的日期查询数据,并将其中某项的值相加,得到总和。这个总和是我要的数据。

刚开始的思路是这样的:


select to_char(数据库中的日期,'yyyymm') as ymd , coalesce(我要的那一项值,0) as amount from 数据表

where 一堆条件...

order by to_char(数据库中的日期,'yyyymm') ;


这样将数据传送到我的java后台,使用Mybatis,每条数据都是一个Map,且可以通过 Map.get("YMD")和Map.get("AOMUNT")来获取日期和数值,接着就是将年份、月份相同的Map的数值相加。

但是,这样做的效率及其慢,我所做的查询的最大情况是50万条记录,足足要用1分钟才能做完所有事。

接下来转换思路,不要那么多数据了,直接在oracle里面将数据相加,把结果发给我:


select to_char(数据库中的日期,'yyyymm') as ymd ,  coalesce( sum(我要的那一项值) ,0  ) as amount from 数据表

where 一堆条件...

group by  to_char(数据库中的日期,'yyyymm');//此处是关键


这样做的效果极佳,查询时间最多不超过5秒。


当然,在后台还要考虑数据不存在的情况,不过这些细节所用的时间都很少。


PS:coalesce(expression1,expression2,...)是一个函数,意思是返回表达式中第一个非空的expression,因为有时候会发生没有数据的情况,此时如果返回空的话,Mybatis会报错。

你可能感兴趣的:(数据库)