计算每日销量变化及新增销售人员统计需求
实现符合要求的每日销量变化统计
我来帮你搞定这个销量统计需求,核心逻辑是仅针对前一日已有销售记录的人员计算总销量变化,同时要正确处理新销售的首日数据(比如Sheila8/3的销量不计入当日统计,但次日计算变化时要用上)。下面用SQL给出完整实现方案:
核心规则回顾
- 起始日
2016-08-01因无前置销售数据,当日销量变化为0 - 新销售(如Sheila在8/3首次销售)的当日销量不计入当日统计,但次日计算变化时需包含该销售前一日的销量
- 每日销量变化 = 当日符合条件人员的总销量 - 这些人员前一日的总销量
SQL实现代码
WITH daily_person_sales AS ( -- 基础销售数据,提取每个人员每日的销量 SELECT Person, Date, Qty FROM SALES ), daily_qualified_persons AS ( -- 筛选出当日符合条件的人员:前一日有销售记录的人员 SELECT curr.Date, curr.Person FROM daily_person_sales curr WHERE EXISTS ( SELECT 1 FROM daily_person_sales prev WHERE prev.Person = curr.Person AND prev.Date = curr.Date - INTERVAL '1 day' ) -- 手动加入起始日的空记录,确保起始日被统计 UNION ALL SELECT '2016-08-01'::DATE, NULL ), daily_current_total AS ( -- 计算每日符合条件人员的当日总销量 SELECT Date, COALESCE(SUM(Qty), 0) AS current_total FROM daily_qualified_persons dqp LEFT JOIN daily_person_sales dps ON dqp.Date = dps.Date AND dqp.Person = dps.Person GROUP BY Date ), daily_prev_total AS ( -- 计算每日符合条件人员的前一日总销量 SELECT dqp.Date, COALESCE(SUM(dps.Qty), 0) AS prev_total FROM daily_qualified_persons dqp LEFT JOIN daily_person_sales dps ON dqp.Person = dps.Person AND dps.Date = dqp.Date - INTERVAL '1 day' GROUP BY Date ) -- 最终计算每日销量变化 SELECT dct.Date, dct.current_total AS 当日符合条件人员总销量, dpt.prev_total AS 前一日对应人员总销量, CASE WHEN dct.Date = '2016-08-01'::DATE THEN 0 ELSE dct.current_total - dpt.prev_total END AS 销量变化 FROM daily_current_total dct JOIN daily_prev_total dpt ON dct.Date = dpt.Date ORDER BY dct.Date;
关键逻辑解释
daily_qualified_persons:通过EXISTS子查询筛选出前一日有销售记录的人员,确保只有符合条件的人员被纳入统计;同时手动加入起始日的空记录,保证起始日能被正常输出。daily_current_total:左连接基础销售数据,计算当日符合条件人员的总销量,无数据时用COALESCE填充为0。daily_prev_total:同样左连接基础数据,但关联的是前一日的销量,这样就能拿到符合条件人员前一日的总销量,为计算变化量做准备。- 最终计算:起始日直接设变化量为0,其他日期用当日总销量减去前一日对应人员的总销量,得到准确的销量变化。
举个例子看Sheila的处理:
- 8/3:Sheila首次销售,前一日(8/2)无她的记录,所以她不在当日符合条件人员中,8/3的总销量不计入她的9单位。
- 8/4:Sheila前一日(8/3)有销售记录,被纳入符合条件人员,当日总销量包含她8/4的销量,同时计算变化量时会用上她8/3的9单位数据。
内容的提问来源于stack exchange,提问作者Coding_Newbie
相关产品推荐
相关产品推荐

