通过代码
SELECT round(sum(total_amount) / count(*), 1) avg_aount,
round((sum(shouldpay) - sum(total_amount)) / count(*), 1) avg_cost
FROM (select order_id,
uid,
event_time,
total_amount
from (select order_id,
uid,
min(event_time) over (partition by uid order by event_time) event_time,
total_amount
from tb_order_overall
) t
GROUP BY uid
HAVING DATE_FORMAT(event_time, '%Y%m') = 202110
) t_o
JOIN(SELECT order_id,
sum(price * cnt) shouldpay
FROM tb_order_detail
GROUP BY order_id) t_d
ON
t_d.order_id = t_o.order_id
思路
请计算2021年10月商城里所有新用户的首***均交易金额(客单价)和平均获客成本(保留一位小数)。
注:订单的优惠金额 = 订单明细里的{该订单各商品单价×数量之和} - 订单总表里的{订单总金额} 。
我们来分析一把
首先是用户要求: 2021-10 新用户,也就是说不仅是要求10月而且之前没有出现过这个人
所以我们先用窗口函数将最小日期列出来,这里为什么是窗口函数:如果直接group by 可能会造成最小日期与订单金额不匹配,我把group by 理解为折叠,虽然是把最小日期查出来,但是amount却是默认的该用户第一次出现在这个表里的日期的金额
select order_id,
uid,
min(event_time) over (partition by uid order by event_time) event_time,
total_amount
from tb_order_overall
然后查对应人
select order_id,
uid,
event_time,
total_amount
from (表1) t
GROUP BY uid
HAVING DATE_FORMAT(event_time, '%Y%m') = 202110
然后内连接订单明细查出来该用户一单应该花多少
SELECT order_id,
sum(price * cnt) shouldpay
FROM tb_order_detail
GROUP BY order_id
然后算出题目要求
SELECT round(sum(total_amount) / count(*), 1) avg_aount,
round((sum(shouldpay) - sum(total_amount)) / count(*), 1) avg_cost
FROM (表2) t_o
JOIN(表3) t_d
ON
t_d.order_id = t_o.order_id