统计数据环比计算

环比计算,算法是:先按照要求计算出一个时间段数据的分组统计作为A表(作为当前数据,假设今天为10.15日),然后将其时间+1个单位再次计算作为b表(实质是计算出前一天的数量放在当前天去对比,如下14日数据变为15日同一天的一个虚拟数据,主要是将前一天数据均向后一天移动一下),然后用a表对b表进行左联接查询,就有如下对应关系(通过时间将前一天数据和当天数据关联在一张表上),然后方便操作,sql语句如下:

a表时间数据b表时间数据
  10.165
10.15510.154
10.14410.142
10.13210.13 
 作为当前数据 前一天数据

 

  <select id="accountGrouwthRate" parameterType="map" resultType="map">
SELECT 
    tt.currentTotal currentTotal,tt.time `time`,
    CASE WHEN
    tt.beforeTotal IS NULL OR tt.beforeTotal=0 THEN 0.00
    ELSE
    FORMAT(((tt.currentTotal-tt.beforeTotal)/tt.beforeTotal)*100,2)
    END ratio
FROM
    (SELECT 
     m.current_total currentTotal,n.before_total beforeTotal,m.time
    FROM
        (SELECT COUNT(t.`id`) current_total , DATE_FORMAT(t.create_time,#{format}) `time`
        FROM u_account t WHERE t.`del_flag`=0 AND t.company_id=#{companyId} AND t.`create_time`  
        BETWEEN DATE_FORMAT(#{time},#{outFormat}) AND  DATE_FORMAT(DATE_ADD(#{time},INTERVAL #{num} ${outUnit}),#{outFormat}) 
        GROUP BY DATE_FORMAT(t.create_time,#{format})
        ) m
    LEFT JOIN
        (SELECT COUNT(t.`id`) before_total ,DATE_FORMAT(DATE_ADD(t.`create_time`,INTERVAL 1 ${unit}),#{format}) `time` 
        FROM u_account t WHERE t.`del_flag`=0 AND t.company_id=#{companyId}    AND t.`create_time`  
        BETWEEN DATE_FORMAT(#{time},#{outFormat}) AND  DATE_FORMAT(DATE_ADD(#{time},INTERVAL #{num} ${outUnit}),#{outFormat}) 
        GROUP BY DATE_FORMAT(DATE_ADD(t.`create_time`,INTERVAL 1 ${unit}),#{format})
        ) n
ON m.time=n.time) tt
  </select>

在如上sql中,如果传入时间为”2018-10“想要查询2018-10~2018-11之间的数据,实际返回往往为空,那么我们需要将其变为2018-10-01~2018-11-01查询这个时间段的数据才可以,如上,我们为了兼容年月日的查询,我们将sql中的变化的部分采用占位符来标识,然后在代码里面组织我们的参数即可,组织参数代码如下:

private Map<String, Object> create_parameter(Map<String, Object> param,Integer num){
        String time = (String) param.get("time");
        int length = time.length();
        String outFormat = null;
        String outUnit = null;
        String format = null;
        String unit = null;
        if(length==4){
            time = time+"-01-01";
            outFormat = "%Y-%m-%d";
            outUnit = "YEAR";
            format = "%Y-%m";
            unit = "MONTH";
        }
        if(length==7){
            time = time+"-01";
            outFormat = "%Y-%m-%d";
            outUnit = "MONTH";
            format = "%Y-%m-%d";
            unit = "DAY";
        }
        if(length==10){
            outFormat = "%Y-%m-%d";
            outUnit = "DAY";
            format = "%Y-%m-%d %h";
            unit = "HOUR";
        }
        if(null!=outFormat && outUnit!=null && null!=format && unit!=null){
            param.put("outFormat", outFormat);
            param.put("outUnit", outUnit);
            param.put("format", format);
            param.put("unit", unit);
        }
        param.put("time", time);
        param.put("num", num);
        return param;
    }

即可实现环比计算,同比计算的算法大同小异。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值