sql复购率计算多种方法

注:这个复购率算的更加细致,比其他的算法更加精妙,能看懂的不多,好好体会!

说明:这是一个订单的复购率,计算的时候单独提取了n天复购的用户明细

关键sql说明:

D:取得用户下的第一单订单的时间,以及把第一单取出来,方便后面把第一单排除,排除后的单就是复购单

od:订单表,关联的时候限制订单时间范围以及排除用户下的第一单    

这里取得是一段时间内,用户的复购情况, adddate用来获取多少天之后,限制了订单表的范围,并且取得是每个用户下的第一单后的多少天的复购情况

 

 

 

以下是sql明细

 SELECT A.day,
IFNULL(cast((base.`3days复购用户数`*1.0/base.`完成用户数`)*100 as decimal(18,2)),'0.00') AS rebuyRate3,
IFNULL(cast((base.`5days复购用户数`*1.0/base.`完成用户数`)*100 as decimal(18,2)),'0.00') AS rebuyRate5,
IFNULL(cast((base.`7days复购用户数`*1.0/base.`完成用户数`)*100 as decimal(18,2)),'0.00') AS rebuyRate7,
IFNULL(cast((base.`15days复购用户数`*1.0/base.`完成用户数`)*100 as decimal(18,2)),'0.00') AS rebuyRate15,
IFNULL(cast((base.`30days复购用户数`*1.0/base.`完成用户数`)*100 as decimal(18,2)),'0.00') AS rebuyRate30,
IFNULL(cast((base.`3days复购单量`/base.`3days复购用户数`) as decimal(18,2)),'0.00') AS avgRebuyNum3,
IFNULL(cast((base.`5days复购单量`/base.`5days复购用户数`) as decimal(18,2)),'0.00') AS avgRebuyNum5,
IFNULL(cast((base.`7days复购单量`/base.`7days复购用户数`) as decimal(18,2)),'0.00') AS avgRebuyNum7,
IFNULL(cast((base.`15days复购单量`/base.`15days复购用户数`) as decimal(18,2)),'0.00') AS avgRebuyNum15,
IFNULL(cast((base.`30days复购单量`/base.`30days复购用户数`) as decimal(18,2)),'0.00') AS avgRebuyNum30,
IFNULL(cast((base.`3days复购单量`/base.`完成用户数`) as decimal(18,2))+1,'0.00') AS avgRebuyFinishNum3,
IFNULL(cast((base.`5days复购单量`/base.`完成用户数`) as decimal(18,2))+1,'0.00') AS avgRebuyFinishNum5,
IFNULL(cast((base.`7days复购单量`/base.`完成用户数`) as decimal(18,2))+1,'0.00') AS avgRebuyFinishNum7,
IFNULL(cast((base.`15days复购单量`/base.`完成用户数`) as decimal(18,2))+1,'0.00') AS avgRebuyFinishNum15,
IFNULL(cast((base.`30days复购单量`/base.`完成用户数`) as decimal(18,2))+1,'0.00') AS avgRebuyFinishNum30
FROM
(
    SELECT DISTINCT order_day AS day
    FROM wireless_statistic_offline.order_detail 
    WHERE order_day>='"+sdate+"' AND order_day<='"+edate+"'
) A
LEFT JOIN
(
    SELECT A.service_stop_day,A.`完成用户数`,
    B.`复购用户数` AS '3days复购用户数',B.`复购单量` AS '3days复购单量',
    C.`复购用户数` AS '5days复购用户数',C.`复购单量` AS '5days复购单量',
    D.`复购用户数` AS '7days复购用户数',D.`复购单量` AS '7days复购单量',
    E.`复购用户数` AS '15days复购用户数',E.`复购单量` AS '15days复购单量',
    F.`复购用户数` AS '30days复购用户数',F.`复购单量` AS '30days复购单量'
    FROM
    (
        SELECT service_stop_day,COUNT(DISTINCT order_phone) AS '完成用户数'
        FROM wireless_statistic_offline.order_detail od
        WHERE  source_type=5 AND promotion_type=8 -- 电销
        AND service_stop_day>='"+sdate+"' AND service_stop_day<='"+edate+"'
        GROUP BY service_stop_day
    ) A
    LEFT JOIN
    (
        SELECT service_stop_day,COUNT(DISTINCT IF(r.rebuyOrderNums!=0,r.order_phone,NULL)) AS '复购用户数',SUM(r.rebuyOrderNums) AS '复购单量'
        FROM
        (
            SELECT D.service_stop_day,D.order_phone,COUNT(DISTINCT od.order_id) AS rebuyOrderNums
            FROM wireless_statistic_offline.order_detail od
            RIGHT JOIN 
            (
            SELECT order_phone,MIN(CONCAT(service_stop_time, '\\t', order_id)) AS tag,date(MIN(service_stop_day)) AS service_stop_day
            FROM wireless_statistic_offline.order_detail od
            WHERE  source_type=5 AND promotion_type=8 -- 电销
            AND service_stop_day>='"+sdate+"' AND service_stop_day<='"+edate+"'
            GROUP BY order_phone
            ) D ON (od.order_phone = D.order_phone
            AND od.service_stop_day >= D.service_stop_day AND od.service_stop_day <= ADDDATE(D.service_stop_day, 2)
            AND od.order_id != substring_index(D.tag, '\\t', - 1))
            GROUP BY D.order_phone
        ) r
        GROUP BY r.service_stop_day
    ) B ON A.service_stop_day=B.service_stop_day
    LEFT JOIN
    (
        SELECT service_stop_day,COUNT(DISTINCT IF(r.rebuyOrderNums!=0,r.order_phone,NULL)) AS '复购用户数',SUM(r.rebuyOrderNums) AS '复购单量'
        FROM
        (
            SELECT D.service_stop_day,D.order_phone,COUNT(DISTINCT od.order_id) AS rebuyOrderNums
            FROM wireless_statistic_offline.order_detail od
            RIGHT JOIN 
            (
            SELECT order_phone,MIN(CONCAT(service_stop_time, '\\t', order_id)) AS tag,date(MIN(service_stop_day)) AS service_stop_day
            FROM wireless_statistic_offline.order_detail od
            WHERE  source_type=5 AND promotion_type=8 -- 电销
            AND service_stop_day>='"+sdate+"' AND service_stop_day<='"+edate+"'
            GROUP BY order_phone
            ) D ON (od.order_phone = D.order_phone
            AND od.service_stop_day >= D.service_stop_day AND od.service_stop_day <= ADDDATE(D.service_stop_day, 4)
            AND od.order_id != substring_index(D.tag, '\\t', - 1))
            GROUP BY D.order_phone
        ) r
        GROUP BY r.service_stop_day
    ) C ON A.service_stop_day=C.service_stop_day
    LEFT JOIN
    (
        SELECT service_stop_day,COUNT(DISTINCT IF(r.rebuyOrderNums!=0,r.order_phone,NULL)) AS '复购用户数',SUM(r.rebuyOrderNums) AS '复购单量'
        FROM
        (
            SELECT D.service_stop_day,D.order_phone,COUNT(DISTINCT od.order_id) AS rebuyOrderNums
            FROM wireless_statistic_offline.order_detail od
            RIGHT JOIN 
            (
            SELECT order_phone,MIN(CONCAT(service_stop_time, '\\t', order_id)) AS tag,date(MIN(service_stop_day)) AS service_stop_day
            FROM wireless_statistic_offline.order_detail od
            WHERE  source_type=5 AND promotion_type=8 -- 电销
            AND service_stop_day>='"+sdate+"' AND service_stop_day<='"+edate+"'
            GROUP BY order_phone
            ) D ON (od.order_phone = D.order_phone
            AND od.service_stop_day >= D.service_stop_day AND od.service_stop_day <= ADDDATE(D.service_stop_day, 6)
            AND od.order_id != substring_index(D.tag, '\\t', - 1))
            GROUP BY D.order_phone
        ) r
        GROUP BY r.service_stop_day
    ) D ON A.service_stop_day=D.service_stop_day
    LEFT JOIN
    (
        SELECT service_stop_day,COUNT(DISTINCT IF(r.rebuyOrderNums!=0,r.order_phone,NULL)) AS '复购用户数',SUM(r.rebuyOrderNums) AS '复购单量'
        FROM
        (
            SELECT D.service_stop_day,D.order_phone,COUNT(DISTINCT od.order_id) AS rebuyOrderNums
            FROM wireless_statistic_offline.order_detail od
            RIGHT JOIN 
            (
            SELECT order_phone,MIN(CONCAT(service_stop_time, '\\t', order_id)) AS tag,date(MIN(service_stop_day)) AS service_stop_day
            FROM wireless_statistic_offline.order_detail od
            WHERE  source_type=5 AND promotion_type=8 -- 电销
            AND service_stop_day>='"+sdate+"' AND service_stop_day<='"+edate+"'
            GROUP BY order_phone
            ) D ON (od.order_phone = D.order_phone
            AND od.service_stop_day >= D.service_stop_day AND od.service_stop_day <= ADDDATE(D.service_stop_day, 14)
            AND od.order_id != substring_index(D.tag, '\\t', - 1))
            GROUP BY D.order_phone
        ) r
        GROUP BY r.service_stop_day
    ) E ON A.service_stop_day=E.service_stop_day
    LEFT JOIN
    (
        SELECT service_stop_day,COUNT(DISTINCT IF(r.rebuyOrderNums!=0,r.order_phone,NULL)) AS '复购用户数',SUM(r.rebuyOrderNums) AS '复购单量'
        FROM
        (
            SELECT D.service_stop_day,D.order_phone,COUNT(DISTINCT od.order_id) AS rebuyOrderNums
            FROM wireless_statistic_offline.order_detail od
            RIGHT JOIN 
            (
            SELECT order_phone,MIN(CONCAT(service_stop_time, '\\t', order_id)) AS tag,date(MIN(service_stop_day)) AS service_stop_day
            FROM wireless_statistic_offline.order_detail od
            WHERE  source_type=5 AND promotion_type=8 -- 电销
            AND service_stop_day>='"+sdate+"' AND service_stop_day<='"+edate+"'
            GROUP BY order_phone
            ) D ON (od.order_phone = D.order_phone
            AND od.service_stop_day >= D.service_stop_day AND od.service_stop_day <= ADDDATE(D.service_stop_day, 29)
            AND od.order_id != substring_index(D.tag, '\\t', - 1))
            GROUP BY D.order_phone
        ) r
        GROUP BY r.service_stop_day
    ) F ON A.service_stop_day=F.service_stop_day
) base ON A.day = base.service_stop_day ";

  • 5
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值