MySQL活动期间订单满600元并且在活动日期之前超过30天没有下过单_20161030
计算 活动期间订单满600元并且在活动日期之前超过30天没有下过单
首先拿到这个需求,首先需要明确活动日期区间 10.29-10.31,其次要取这个时间段内某天订单额最高的那天及订单额,再次需要判断这个用户在29号之前下过单,在29号之前的末单日期和10.29号之间的天数间隔大于30天
因此就转化为取两个表日期的问题
1、第一个表取所有用户在10.29号之前的末单日期,末单金额,这个表为主表 后面表left join 它
2、第二个表取活动期间订单额最高的那天(需要嵌套,先把这3天每天金额算出来,group by 用户ID,订单日期 按照用户ID升序 金额降序 再把这个表group by 用户ID 取出金额最高的这天)
3、然后第二个表left join 第一个表 以用户ID相等为条件
SELECT c.城市,c.用户ID,d.用户名称,d.用户地址,d.联系电话,c.销售员,c.订单日期,c.订单额,c.标识,c.上次订单日期 AS 29号之前末单日期,c.上次金额 AS 29号之前末单金额,e.第几天次 AS 29号之前末单为第几天次,c.上次下单距离29号相差天数 AS 29号之前末单日期距离29号相差天数 FROM ( SELECT a.*,b.订单日期,b.订单额 ,CASE WHEN b.销售员 IS NULL THEN a.上次销售员 ELSE b.销售员 END AS 销售员 ,CASE WHEN b.订单日期 IS NOT NULL AND b.订单额>=600 THEN ">=600" WHEN b.订单日期 IS NOT NULL AND b.订单额<600 THEN "<600" ELSE "10.29号到11.1号未下单" END AS 标识 ,TIMESTAMPDIFF(DAY,a.上次订单日期,"2016-10-29")AS 上次下单距离29号相差天数 FROM (#取所有用户10.29号之前最后一次订单日期 SELECT a2.城市,a2.用户ID,a2.订单日期 AS 上次订单日期,a2.销售员 AS 上次销售员,a2.金额 AS 上次金额 FROM ( SELECT a1.城市,a1.用户ID,DATE(a1.订单日期) AS 订单日期,SUM(金额) AS 金额,a1.销售员 FROM `a003_order` AS a1 WHERE a1.城市='长春' AND a1.订单日期<"2016-10-29" AND a1.金额>0#取完各用户 GROUP BY a1.用户ID,DATE(a1.订单日期) ORDER BY a1.用户ID,DATE(a1.订单日期) DESC ) AS a2 GROUP BY a2.用户ID ) AS a LEFT JOIN (#用户在10.29到11.01订单额最高的一天 SELECT b2.用户ID,b2.订单日期,b2.销售员,b2.订单额 FROM ( SELECT b1.用户ID,DATE(b1.订单日期) AS 订单日期,b1.销售员,SUM(b1.金额) AS 订单额 FROM `a003_order` AS b1 WHERE b1.城市="长春" AND b1.订单日期>="2016-10-29" AND b1.订单日期<"2016-11-01" AND b1.金额>0 GROUP BY b1.用户ID,DATE(b1.订单日期) ORDER BY b1.用户ID,SUM(b1.金额) DESC ) AS b2 GROUP BY b2.用户ID ) AS b ON a.用户ID=b.用户ID ) AS c LEFT JOIN `a001_resterant`AS d ON d.用户ID=c.用户ID LEFT JOIN `tb003_08` AS e ON e.用户ID=c.用户ID AND e.上次订单日期=c.上次订单日期 WHERE c.上次下单距离29号相差天数>=30 AND c.标识=">=600"