按照不同的月周期统计数据 - sql

      现在有一个需求:每月26号到25号为一个企业月(即:2019年2月对应的起止日期是: 2019-01-26, 2019-02-25),一个产品分优等品、一等品、合格品、不合格;把一个企业月之内的每种等级的产品的产量的总和求出来。

      前台传来开始时间的年份月份,结束时间的年份月份,格式为:yyyy-MM。首先得到开始时间的26号,结束时间的25号。

      本身我的想法是:求每个月的四种等级产品的总和。

      即: 开始时间为2019-01,结束时间为2019-12,查12次。

      后来发现sql里有些函数可以帮忙处理,一次搞定。sql如下:

    select to_char(add_months(produce_date - 26,1)  ,  'yyyy-mm' ) || grade  date_grade,
        sum(yield) yield 
        from t_produce_info  
        WHERE produce_name = #{produceName} 
        and produce_date >= #{startDate,jdbcType=TIMESTAMP}
        and produce_date <= #{endDate,jdbcType=TIMESTAMP}
        group by to_char(add_months(produce_date - 26,1)  , 'yyyy-mm' ) || grade;

      解释一下,首先,produce_date是生产日期,Date减去一个数字意思是减去几日。

      生产日期 减 26,可以理解成把所有日期推前26天,只要是该企业月的日期,都会变成1日至31日之间。

      举个例子,2019-1-30按照企业月是2月,但-26以后是2019-01-04;2019-2-24按照企业月是2月,但-26以后是2019-01-30。

      ADD_MONTHS是运算函数,函数将一个日期上加上一指定的月份数,所以,日期中的日是不变的。经过 add_months(produce_date-26,1) 后, 日期就变成了其企业月对应的月中的日期。使用to_char,则忽略掉日期,只保留你年月,再拼接上等级,使用group by分类,则可以求企业月每种产品等级的统计数据。

      统计结果:

      唯一的缺憾是:若当月没有生产该种等级产品,则查询不到。若有人能解决,求联系,微信:1907971839

      PS:甲方又改需求了。。。 要求1月是1月1日到1月25日, 6月是5月26日到6月31日,7月是7月1日到7月25日,12月是11月26日到12月31日。 

      我还没想出来一条sql搞定的办法。。。若有人能解决,求联系,微信:1907971839

发布了48 篇原创文章 · 获赞 36 · 访问量 13万+

猜你喜欢

转载自blog.csdn.net/weixin_42845682/article/details/88353256
今日推荐