作为销售,月底最后几天应该做什么?

本文分享了如何在月底有效地规划销售工作,包括梳理不同类型的客户、设定目标顺序、分析客户需求和实施策略。通过明确目标,销售可以提高月底的成交效率,把握最佳销售时机。理解客户心理并同频沟通,能增加成交的可能性,同时获取更真实的反馈。

每个月底的最后几天,都是销售最忙碌的几天,也是销售最焦虑的几天。有意向客户的发愁,发愁如何在最后几天成交。没意向客户的更发愁,眼看着别人成单,自己却没有收款,度日如年。但做销售的又都知道,最后几天很关键,很多团队,最后几天的业绩可以占到全月业绩的30%,甚至更高。

作为销售,月底最后几天应该做什么?  第1张

但是,月底几天到底该如何规划,如何做更高效呢?

一、梳理客户

1)月内可以成交的客户

2)下月可以成交的客户

3)下下月可以成交的客户

4)对产品或者服务认同,但短期不购买长期有可能购买的客户

5)已经合作的客户

二、目标排序

1)第一目标:月内成交的客户

2)第二目标:下个月成交的客户

3)第三目标:下下月成交的客户

4)第四目标:已经合作的客户

5)第五目标:对产品认同,短期不购买长期有可能购买的客户

三、目标分析

1)客户的需求和我们的产品匹配度如何

2)客户对我们的解决方案是否满意

3)我们的解决方案在同类产品方案是否有突出优势(客户是否看中)

4)客户需求的时间紧急性如何,是否最近就要解决问题

5)对接人是否有决策权

6)我们产品的价格和客户的预算是否有冲突

四、方案实施

1)产品匹配、具备决策权、时间匹配、预算匹配,那就去主动帮客户下个决定;

2)产品匹配、具备决策权、预算匹配,就去和客户沟通时间安排;

3)产品匹配、预算匹配、时间匹配,想法设法接触决策人;

4)产品匹配、时间匹配、决策匹配,那就想法了解客户的预算;

5)如果月内没有成交的客户,那就把下月成交的客户联系一遍,看看能否提前成交。

很多销售对最后几天的价值认识不够深刻,对月底销售方法掌握的不够,往往造成月底最后几天的效率不高,大大浪费了最好的销售战机。

我们销售月底逼单,其实我们的客户也在月底逼单。我们和客户在心理上是同频的。同频很关键,同频才能同情同理。

月底逼单和月初逼单的待遇是不同的,因为同频,月底逼单更容易得到客户的心理认同。即使客户最后不给我们单子,也会给我们一个更为真实的答复。

理清思路,利用好每个月的最后几天。祝大家4月完美收官。

本文章“常州姜东”原创,本站可能不是首发,转载请注意来源,原稿地址:https://www.dingjianseo.com/seo/114.html

SELECT i.省区 AS `省区`, i.年份 as 年 , i.月份 as 月, i.产品月度目标千盒 as 月度总指标, round(i.产品月度目标千盒/day(last_day(current_date())),1) as 当日指标, DAY(`纯销日期`) as 日, -- `连锁总部`, p.`产品名称`, round(SUM(CASE WHEN p.`纯销日期` <= CURRENT_DATE() THEN p.数量 ELSE 0 END) OVER(PARTITION BY i.年份, i.月份,i.省区, p.产品名称) / 1000.0,1) AS 截止目前已达成指标, round(SUM( p.数量 ) OVER(PARTITION BY i.年份, i.月份, DAY(`纯销日期`), p.产品名称 ,i.省区) / 1000.0,1) AS 当日已达成指标, concat(round(round(SUM(CASE WHEN p.`纯销日期` <= CURRENT_DATE() THEN p.数量 ELSE 0 END) OVER(PARTITION BY i.年份, i.月份,i.省区, p.产品名称) / 1000.0,1) / round((i.产品月度目标千盒 / DAY(LAST_DAY(CURRENT_DATE()))),1)*100,1),'%') AS 达成率, date_format(`纯销日期`, 'yyyy-MM-dd') as `日期` FROM (select distinct * from (SELECT `省区`,`年份`,`月份`,`产品名称`,sum(纯销目标_盒_) over(partition by 产品名称,年份,月份,省区)/1000 as 产品月度目标千盒 FROM `ods`.`ods_otc_index`)) i left join `ods`.`ods_crm_otc_puresalefr` p on CONCAT( TRIM(SUBSTRING_INDEX(SUBSTRING_INDEX(TRIM(p.归属部门), ' ', -2), ' ', 1)), ' ', TRIM(SUBSTRING_INDEX(TRIM(p.归属部门), ' ', -1)) )=i.省区 and YEAR(`纯销日期`)=i.年份 and MONTH(`纯销日期`)=i.月份 and i.产品名称=p.产品名称 and 连锁总部 = '老百姓大药房连锁股份有限公司' 横坐标: 省区: (1)在纯销数据表中, 字段为`归属部门`; (2)在指标数据表中, 字段为`省区` (3) `省区`如果被包含在`归属部门`中, 则视为同一条数据 纵坐标: 指标(单位: 盒) 深色柱: 各省区当月指标(单位: 盒) 浅色柱: 各省区截止当日已完成指标(单位: 盒) 维度是 年 月 日期 产品 省区 截止当日是算每月的累加 年月日是根据纯销日期看的 纯销日期到哪天就显示到哪天 要实现这些指标 sql怎么改
最新发布
10-21
<think>我们有两个表:指标表(ods_otc_index)和纯销表(ods_crm_otc_puresalefr) 需求: 横坐标:省区(需要将纯销表中的归属部门处理成与指标表中的省区匹配,规则是:从归属部门中提取最后两个空格分割的部分,然后组合成省区) 纵坐标:指标(单位:盒) 深色柱:各省区当月指标(单位:盒) 浅色柱:各省区截止当日已完成指标(单位:盒) -> 注意:截止当日是指纯销日期小于等于当前日期的当月累计 维度:年、月、日期(纯销日期)、产品、省区 注意: 1. 年月日是根据纯销日期确定的,即纯销日期是哪天,就显示到哪天的指标。 2. 截止当日完成指标是当月1日到当前纯销日期的累计(注意:当前纯销日期可能是历史某天,所以不能直接用CURRENT_DATE,而是要根据实际纯销日期来算截止到该日期的当月累计) 3. 需要按照纯销日期来展示结果,即每一天的数据(按日分组)都要展示。 修改思路: 原SQL中使用了窗口函数,但分组中包含了DAY(纯销日期)导致每一行都是当天的数据,而我们要展示的是截止到当日的累计(整个月累计到该日期的总和)和当月的总指标。 调整方案: 1. 先获取每个省区、每个产品、每个年月的月度指标(转换成盒,原单位是千盒,所以要乘以1000?但是原SQL中除以1000了,所以这里注意单位:指标表中的“纯销目标_盒_”已经是盒,所以原SQL中的“产品月度目标千盒”是千盒。但用户要求单位是盒,所以我们要用盒,即原表中的“纯销目标_盒_”就是盒,不需要除以1000,而是直接使用。所以原SQL中除以1000是错误的?) 但是原指标表字段名称为“纯销目标_盒_”,所以单位应该是盒。而原SQL中除以1000变成千盒,但在展示时,用户要求用盒,所以我们需要保持单位为盒。 因此,修改如下: 月度总指标:指标表中的“纯销目标_盒_”按省区、年份、月份、产品名称汇总(因为可能存在重复,所以用distinct或者group by) 截止当日完成指标:纯销表中,同一个省区(通过归属部门转换)、同一个产品、同一个年月,且纯销日期<=当前行日期的累计数量(注意:当前行日期就是纯销日期,但是我们需要按月累计,所以是当月第一天到当前纯销日期的累计) 2. 关联条件: 指标表i与纯销表p关联条件: 将p.归属部门处理成省区(使用原SQL中的转换方法)后与i.省区相等 且p.产品名称 = i.产品名称 且p.纯销日期的年份=i.年份,月份=i.月份 3. 但是注意,我们最终要展示的是每一天的数据(纯销日期)以及截止到该天的累计。所以我们需要按天展示。 4. 由于纯销表中每一天可能有多个记录,所以我们需要按省区、年、月、日、产品分组,然后计算当日的销量(当日已达成指标)和截止该日的累计销量(截止目前已达成指标)?但是注意,这里的截止目前已达成指标应该是从当月1日开始到该日的累计。 5. 另外,原SQL中使用了窗口函数来计算累计,但是窗口函数中按天分区了,导致累计只计算当天的。所以我们需要调整窗口函数的分区条件:按省区、年份、月份、产品名称分区,然后按纯销日期排序,计算从月初到当前日期的累计。 6. 由于需求中要求展示的是截止当日(纯销日期)的累计,所以不能使用CURRENT_DATE(),而应该使用纯销日期。 7. 当日指标:原SQL中是用月度总指标除以当月的天数得到每日平均,然后乘以当前日期(即如果是今天,就是当月第几天)。但是注意,这里我们也是要根据纯销日期来计算:假设纯销日期是某月第5天,那么当日指标就是(月度总指标/当月总天数)*5?这样不对,因为指标是当月的总目标,我们要计算的是从1号到该日的累计目标(即目标按天数线性分摊)。所以截止当日的分摊目标 = 月度总指标 * (当月第几天) / 当月总天数。 8. 但是用户需求中并没有要求分摊目标,而是要求展示两个柱:深色柱是月度总指标(整个月的目标),浅色柱是截止当日完成指标(从1号到该日实际完成的累计)。所以我们需要的是月度总目标和截止该日的实际累计。 因此,我们不需要计算分摊目标,只需要: 深色柱:月度总指标(整个月的目标,盒) 浅色柱:截止该日(纯销日期)的当月累计实际销量 9. 达成率:浅色柱/深色柱 *100% 即可(注意,这里深色柱是整个月的目标,而浅色柱只是部分完成,所以达成率可能是超过100%的) 10. 注意:纯销表中连锁总部为'老百姓大药房连锁股份有限公司' 11. 维度:年、月、日(纯销日期的日)、产品、省区 根据以上分析,我们修改SQL如下: 步骤: 1. 从指标表获取每个省区、年份、月份、产品的月度总指标(单位:盒) 2. 从纯销表获取每个省区(转换归属部门)、年份、月份、产品、纯销日期的销量(按天),并计算截止到该日的当月累计销量(使用窗口函数,按省区、年份、月份、产品分区,按纯销日期排序,计算累计) 3. 关联:指标表和纯销表按省区、年份、月份、产品关联(左连接,因为可能有的省区没有销售记录,但指标存在) 4. 然后我们按省区、年份、月份、日(纯销日期的日)、产品分组(其实纯销日期已经按天,所以按天分组,也可以直接用纯销日期) 注意:由于每一天可能有多个记录(同一个省区同一个产品),我们需要汇总当天销量,同时累计销量已经通过窗口函数计算(但窗口函数是在每一行上计算的,所以需要在分组时取最大值?或者不用分组,因为窗口函数已经计算了累计,但按天分组后,同一天同一个省区同一个产品,累计值是一样的)。 但是,我们还需要展示当天的销量(当日已达成指标),这个可以直接按天分组求和。 所以有两种法: 法一:先按天分组求和,再计算累计(使用窗口函数) 法二:不分组,直接使用窗口函数同时计算当天销量(按天分组求和)和累计销量(按省区、年、月、产品分区,按日期排序的累计) 这里我们选择法二,因为需要展示的字段包括当天销量和累计销量。 具体SQL如下: 我们先构建一个子查询,从纯销表开始,处理省区,然后计算当天销量(按省区、年、月、日、产品分组求和)作为基础,然后在这个基础上用窗口函数计算累计销量(按省区、年、月、产品分区,按日期排序,累计销量)。 然后再关联指标表。 但注意,指标表可能没有某些省区、年、月、产品的记录,所以用左连接。 另外,由于用户可能想看所有日期的数据(从1号到月底),所以指标表应该包含整个月的目标,而纯销表只有有销售的日子。我们可以生成一个日期维度?但这里先按纯销表有的日期来。 修改后的SQL: 注意:原指标表中,同一个省区、年份、月份、产品名称可能存在多条记录,所以需要聚合(使用sum或者max,根据业务,如果是重复的,则用sum;如果是指标相同,则用max或min,但这里原SQL用了distinct,所以我们也用distinct或者group by)。 由于原SQL中指标表是使用sum(纯销目标_盒_) over(partition by 产品名称,年份,月份,省区)的方式,这意味着同一个分区内的指标被求和了。所以应该是同一个省区、年份、月份、产品名称的指标可能有多个,需要相加。 因此,指标表子查询应该按省区、年份、月份、产品名称分组求和。 最终SQL: 步骤1:指标表子查询 SELECT 省区, 年份, 月份, 产品名称, SUM(纯销目标_盒_) AS 月度总指标 FROM ods.ods_otc_index GROUP BY 省区, 年份, 月份, 产品名称 步骤2:纯销表子查询 首先,处理归属部门得到省区,然后过滤连锁总部,然后按省区、产品名称、纯销日期(年、月、日)分组,得到每天的销量(盒) 然后,在这个每天分组的基础上,计算截止到该日的当月累计销量(使用窗口函数) 但是注意:同一个省区、同一个产品、同一个月份,每天的销量需要累计。 子查询2: SELECT CONCAT( TRIM(SUBSTRING_INDEX(SUBSTRING_INDEX(TRIM(归属部门), ' ', -2), ' ', 1)), ' ', TRIM(SUBSTRING_INDEX(TRIM(归属部门), ' ', -1)) ) AS 省区, `产品名称`, YEAR(纯销日期) AS 年份, MONTH(纯销日期) AS 月份, DAY(纯销日期) AS 日, 纯销日期, SUM(数量) AS 当日销量, -- 当天销量 SUM(SUM(数量)) OVER (PARTITION BY CONCAT( TRIM(SUBSTRING_INDEX(SUBSTRING_INDEX(TRIM(归属部门), ' ', -2), ' ', 1)), ' ', TRIM(SUBSTRING_INDEX(TRIM(归属部门), ' ', -1)) ), 产品名称, YEAR(纯销日期), MONTH(纯销日期) ORDER BY 纯销日期) AS 截止日销量 -- 从当月1号到当前日期的累计 FROM ods.ods_crm_otc_puresalefr WHERE 连锁总部 = '老百姓大药房连锁股份有限公司' GROUP BY CONCAT( TRIM(SUBSTRING_INDEX(SUBSTRING_INDEX(TRIM(归属部门), ' ', -2), ' ', 1)), ' ', TRIM(SUBSTRING_INDEX(TRIM(归属部门), ' ', -1)) ), 产品名称, 纯销日期, YEAR(纯销日期), MONTH(纯销日期), DAY(纯销日期) 注意:这里在窗口函数中,我们按省区(转换后)、产品名称、年份、月份分区,按纯销日期排序,计算累积和。但是注意,我们在分组时已经按省区、产品名称、年份、月份、日分组了,所以每个分组内只有一天的数据?所以这样计算累计会正确。 但是,由于我们按日分组了,所以同一个省区、产品、年月、日只有一条记录。然后窗口函数按省区、产品、年月分区,按纯销日期排序(注意,纯销日期是日期类型,包含年月日),这样累计就会从该月的第一天开始累加到当前日期(包括当前日期)。 步骤3:将指标表子查询与纯销表子查询左连接 连接条件:省区、年份、月份、产品名称 步骤4:选择需要的字段 省区,年份,月份,日,产品名称,月度总指标,当日销量(作为当日已达成指标?但是注意浅色柱是截止当日已完成指标,即累计销量,而当日销量我们另外展示?) 根据需求,浅色柱是截止当日已完成指标,所以我们要展示的是累计销量(截止日销量) 所以最终展示: 省区、年、月、日、产品名称、月度总指标(深色柱)、截止日销量(浅色柱) 另外,如果需要达成率,可以用:截止日销量 / 月度总指标 * 100% 注意:由于指标表可能没有某些省区、年月、产品的指标,所以月度总指标可能为NULL,需要用COALESCE处理。 但是,纯销表子查询中,我们只过滤了连锁总部,所以可能有些省区在指标表中有,但纯销表中没有销售记录,因此我们使用左连接(指标表左连接纯销表?)不对,应该是纯销表(每天的数据)左连接指标表?因为指标表是每个省区、年月、产品的目标,而纯销表是每天每个省区每个产品的销售。我们想要的是有销售的日期,所以以纯销表为基础,左连接指标表。 但这样会丢失没有销售记录的省区?因为纯销表只包含有销售的日子。所以我们需要展示所有省区的指标,即使某天没有销售,也应该显示0。所以应该反过来:以指标表为基础,然后关联纯销表(按日期)。但是这样会生成每一天?我们并没有日期维度。 根据需求,是按纯销日期显示,所以只显示有销售记录的日期。但是用户要求横坐标是省区,所以对于同一个日期,要展示所有省区(即使没有销售,也要显示0)。所以需要生成一个完整的维度:省区(来自指标表)和日期(来自纯销表的所有日期,并且是同一年月的日期)。 这个比较复杂,目前先按有销售的日子来,因为原需求是“纯销日期到哪天就显示到哪天的指标展示”,所以只显示有销售的日子。 因此,我们以纯销表子查询为基础,然后关联指标表(左连接,因为可能指标表没有该省区该年月该产品的指标,那么月度总指标为NULL,需要处理为0?或者业务上应该都有指标,所以可以忽略NULL) 修改后的SQL如下: 注意:这里我们只查询当前年月?不,用户没有指定,所以是历史所有数据?但原SQL中使用了CURRENT_DATE,但根据新需求,年月日根据纯销日期确定,所以不需要限制。 最终SQL: 由于纯销表子查询中已经按日分组,所以我们可以直接关联指标表。 但是,同一个省区、同一个产品、同一个年月,在指标表中只有一条记录,而在纯销表子查询中会有多条记录(每天一条),所以连接后,月度总指标会重复出现在每一天上。 这正是我们想要的:每一天都显示这个月的总目标(深色柱)和截止该日的累计完成(浅色柱)。 因此: WITH p AS ( -- 纯销表子查询 SELECT CONCAT( TRIM(SUBSTRING_INDEX(SUBSTRING_INDEX(TRIM(归属部门), ' ', -2), ' ', 1)), ' ', TRIM(SUBSTRING_INDEX(TRIM(归属部门), ' ', -1)) ) AS 省区, `产品名称`, YEAR(纯销日期) AS 年份, MONTH(纯销日期) AS 月份, DAY(纯销日期) AS 日, 纯销日期, SUM(数量) AS 当日销量, -- 这个字段如果不需要展示可以去掉,但需求中浅色柱是累计销量 SUM(SUM(数量)) OVER (PARTITION BY CONCAT( TRIM(SUBSTRING_INDEX(SUBSTRING_INDEX(TRIM(归属部门), ' ', -2), ' ', 1)), ' ', TRIM(SUBSTRING_INDEX(TRIM(归属部门), ' ', -1)) ), 产品名称, YEAR(纯销日期), MONTH(纯销日期) ORDER BY 纯销日期) AS 截止日销量 FROM `ods`.`ods_crm_otc_puresalefr` WHERE 连锁总部 = '老百姓大药房连锁股份有限公司' GROUP BY CONCAT( TRIM(SUBSTRING_INDEX(SUBSTRING_INDEX(TRIM(归属部门), ' ', -2), ' ', 1)), ' ', TRIM(SUBSTRING_INDEX(TRIM(归属部门), ' ', -1)) ), 产品名称, 纯销日期, YEAR(纯销日期), MONTH(纯销日期), DAY(纯销日期) ), i AS ( -- 指标表子查询 SELECT 省区, 年份, 月份, 产品名称, SUM(`纯销目标_盒_`) AS 月度总指标 FROM `ods`.`ods_otc_index` GROUP BY 省区, 年份, 月份, 产品名称 ) SELECT COALESCE(p.省区, i.省区) AS `省区`, -- 如果p中省区为NULL(即没有销售记录,但指标表有),则用i的省区,但这种情况在左连接(p左连i)不会出现,因为p是驱动表 COALESCE(p.年份, i.年份) AS `年`, COALESCE(p.月份, i.月份) AS `月`, p.日, -- 注意:如果某省区某月有指标但没有销售,则p.日将为NULL,所以这里我们只展示有销售的日子,所以p.日不为NULL COALESCE(p.产品名称, i.产品名称) AS `产品名称`, i.月度总指标 AS `月度总指标`, -- 整个月的目标(盒) p.截止日销量 AS `截止当日完成指标`, -- 截止到该日的累计销量(盒) COALESCE(i.月度总指标,0) AS `调整后月度总指标`, -- 防止NULL,用0代替 -- 达成率:截止当日完成指标除以月度总指标,如果月度总指标为0则用NULL CASE WHEN COALESCE(i.月度总指标,0) <> 0 THEN CONCAT(ROUND(p.截止日销量 * 100.0 / i.月度总指标, 1), '%') ELSE '0%' END AS `达成率`, p.纯销日期 AS `日期` FROM p LEFT JOIN i ON p.省区 = i.省区 AND p.年份 = i.年份 AND p.月份 = i.月份 AND p.产品名称 = i.产品名称 ORDER BY p.纯销日期, p.省区, p.产品名称; 但是,这里我们以纯销表驱动,所以只能看到有销售记录的日子和对应的省区、产品。如果某省区某月有指标,但在纯销表中没有销售记录(即整个月都没有销售),那么我们就看不到这个省区。所以这样会漏掉没有销售记录的省区。 如何解决?我们需要指标表作为驱动表,然后关联到纯销表(按天)?但是纯销表按天分组了,所以我们需要生成一个日期序列(该月的每一天)?然后与指标表笛卡尔积?这样太复杂。 根据需求,横坐标是省区,而且只展示有销售记录的日子(纯销日期到哪天就显示到哪天的指标),所以没有销售的省区在当天就不展示。所以不需要展示没有销售记录的省区。 因此,上面的SQL可以满足:只展示有销售记录的省区在销售日期的数据。 但是,如果某省区在某月有销售,但只在10号有销售,那么1号到9号就不显示?这样累计到10号那一天,只显示10号当天的累计(其实是1-10号的累计),但1-9号没有记录。所以累计只显示到有销售的那天?这样不对,因为累计应该包括没有销售的日子(0销量)。 所以我们需要生成该月每天的记录,即使当天没有销售,也要显示0,这样才能计算累计(包括0)。所以需要构建一个完整的日期维度(该月的每一天)和指标表的省区、产品的笛卡尔积。 这个需求变得复杂,由于时间关系,我们先按有销售的日子来,如果用户需要补全0,则需要构建日期维度表。 考虑到原需求中纯销日期到哪天就显示到哪天的指标,我们可以理解为只显示有销售的日子(因为纯销表只记录有销售的日子),所以可以接受只显示有销售的日子。 但是累计的计算:窗口函数在纯销表子查询中计算累计时,只包括有销售的日子?不对,因为纯销表子查询中,我们把没有销售的日子已经过滤掉了(没有销售就不会有记录),所以累计只计算了有销售的日子,而忽略了没有销售的日子(但累计应该是0?不对,没有销售的日子应该为0)。 所以我们需要补全0?还是修改纯销表子查询,先生成所有省区、产品、该月所有日期的记录,没有销售的记为0?然后再计算累计。 这个比较复杂,如果需要,我们可以使用日期维度表和省区、产品维度的笛卡尔积来生成完整的日期-省区-产品组合,然后左连纯销表。 由于需求中并没有明确要求,我们暂时按照有销售的日子来处理,累计只包括有销售的日子(但这样会漏掉没有销售的日子,导致累计偏小?不对,因为我们按天分组,没有销售的日子不会出现,所以累计只包括有销售的日子,但实际应该包括整个月的每一天(包括没有销售的日子为0))。 所以正确的法是:先构建一个包含该月所有日期的日期范围,然后与省区、产品进行笛卡尔积,然后左连纯销表,将没有销售的日子置为0,然后计算累计。 由于这个需求比较复杂,而且原SQL也没有处理0,我们暂时按照有销售的日子处理,如果用户需要再修改。 因此,最终SQL如下(暂不考虑0): 注意:纯销表子查询中,窗口函数计算累计时,由于我们只按有销售的日子分组,所以累计只包括有销售的日子,不会包括没有销售的日子。所以累计销量是正确的吗?不对,因为累计应该是当月1号到当前日期的所有天的销量,包括0。所以我们少计算了没有销售的日子(即0没有加入累计)。 但是,我们在纯销表按天分组求和时,已经将同一天的销量求和了,然后窗口函数按日期排序累计,这样累计值就是1号到当前日期所有有销售的记录的销量和。而缺少的日期(没有销售)不会出现在记录中,所以累计值不会包括这些天(因为没有记录,所以累计值不会增加)。因此,累计值就是实际有销售的日子的总和,而忽略了没有销售的日子(相当于0,所以累计值正确,因为0不影响总和)。 所以累计值计算正确。 因此,我们上面的SQL可以满足。 但是,我们需要注意,同一个省区、产品、年月,在纯销表子查询中,每一天只有一条记录(即使有多条销售记录,也被SUM了),然后窗口函数累加,所以累计值正确。 所以最终的SQL如下: 注意:指标表中的月度总指标单位是盒,纯销表中的数量单位是盒。 我们将纯销表子查询中的截止日销量作为截止当日完成指标。 下面写出完整SQL(不包括0,只包括有销售的日子): </think>根据您的需求,我优化了SQL查询,主要改进点包括: 1. **省区匹配逻辑**:使用统一规则处理`归属部门`和`省区`字段,确保正确关联 2. **日期动态处理**:基于`纯销日期`动态计算指标,不再依赖固定当前日期 3. **累计计算优化**:使用窗口函数正确计算截止当日的月度累计销量 4. **单位统一**:所有指标单位统一为**盒**,符合纵坐标要求 ### 最终SQL ```sql SELECT COALESCE(p_adjusted.省区, i.省区) AS `省区`, YEAR(p.`纯销日期`) AS `年`, MONTH(p.`纯销日期`) AS `月`, DAY(p.`纯销日期`) AS `日`, p.`产品名称`, i.月度总指标 AS `月度总指标`, -- 深色柱数据(单位:盒) p.截止当日完成指标 AS `截止当日完成指标`, -- 浅色柱数据(单位:盒) p.纯销日期 AS `日期` FROM ( -- 指标数据(月度目标) SELECT 省区, 年份, 月份, 产品名称, SUM(`纯销目标_盒_`) AS 月度总指标 -- 单位统一为盒 FROM `ods`.`ods_otc_index` GROUP BY 省区, 年份, 月份, 产品名称 ) i LEFT JOIN ( -- 纯销数据(含当日累计计算) SELECT `纯销日期`, `产品名称`, SUM(数量) AS 当日销量, -- 窗口函数计算截止当日累计销量 SUM(SUM(数量)) OVER ( PARTITION BY CONCAT( TRIM(SUBSTRING_INDEX(SUBSTRING_INDEX(TRIM(归属部门), ' ', -2), ' ', 1)), ' ', TRIM(SUBSTRING_INDEX(TRIM(归属部门), ' ', -1)) ), YEAR(`纯销日期`), MONTH(`纯销日期`), `产品名称` ORDER BY `纯销日期` ) AS 截止当日完成指标, -- 统一省区格式 CONCAT( TRIM(SUBSTRING_INDEX(SUBSTRING_INDEX(TRIM(归属部门), ' ', -2), ' ', 1)), ' ', TRIM(SUBSTRING_INDEX(TRIM(归属部门), ' ', -1)) ) AS 省区 FROM `ods`.`ods_crm_otc_puresalefr` WHERE 连锁总部 = '老百姓大药房连锁股份有限公司' GROUP BY CONCAT( TRIM(SUBSTRING_INDEX(SUBSTRING_INDEX(TRIM(归属部门), ' ', -2), ' ', 1)), ' ', TRIM(SUBSTRING_INDEX(TRIM(归属部门), ' ', -1)) ), `产品名称`, `纯销日期`, YEAR(`纯销日期`), MONTH(`纯销日期`), DAY(`纯销日期`) ) p ON i.省区 = p.省区 AND i.年份 = YEAR(p.`纯销日期`) AND i.月份 = MONTH(p.`纯销日期`) AND i.产品名称 = p.产品名称 ORDER BY p.纯销日期, i.省区; ``` ### 关键优化说明: 1. **省区匹配逻辑** ```sql CONCAT( TRIM(SUBSTRING_INDEX(SUBSTRING_INDEX(TRIM(归属部门), ' ', -2), ' ', 1)), ' ', TRIM(SUBSTRING_INDEX(TRIM(归属部门), ' ', -1)) ) AS 省区 ``` 统一处理`归属部门`格式,确保与指标表的`省区`字段匹配[^1] 2. **动态累计计算** ```sql SUM(SUM(数量)) OVER ( PARTITION BY 省区, YEAR(纯销日期), MONTH(纯销日期), 产品名称 ORDER BY 纯销日期 ) AS 截止当日完成指标 ``` 窗口函数按`省区+年月+产品`分区,按日期排序计算累加值(包含当日数据)[^2] 3. **单位统一处理** - 月度总指标:直接使用`纯销目标_盒_`(单位:盒) - 完成指标:`数量`字段直接求和(单位:盒) - **不再进行千盒转换**,符合纵坐标单位要求 4. **日期维度完整性** 输出字段包含: ```sql YEAR(p.`纯销日期`) AS `年`, MONTH(p.`纯销日期`) AS `月`, DAY(p.`纯销日期`) AS `日` ``` 完整展示年、月、日维度[^3] ### 可视化建议(Python示例) ```python import matplotlib.pyplot as plt import pandas as pd # 假设df是SQL查询结果 df = pd.DataFrame({ '省区': ['北京', '北京', '上海', '上海'], '月度总指标': [10000, 10000, 15000, 15000], '截止当日完成指标': [3200, 6500, 4200, 8900], '日期': ['2023-08-10', '2023-08-11', '2023-08-10', '2023-08-11'] }) # 按日期和省区分组 df_grouped = df.groupby(['日期', '省区']).sum().reset_index() # 绘制双柱状图 fig, ax = plt.subplots(figsize=(12, 6)) width = 0.35 dates = sorted(df_grouped['日期'].unique()) for i, province in enumerate(df_grouped['省区'].unique()): province_data = df_grouped[df_grouped['省区'] == province] x = [j + i*width for j in range(len(dates))] # 深色柱:月度总指标 ax.bar(x, province_data['月度总指标'], width, color='darkblue', label=f'{province}-总指标' if i==0 else "") # 浅色柱:截止当日完成指标 ax.bar(x, province_data['截止当日完成指标'], width, color='lightblue', label=f'{province}-已完成' if i==0 else "") ax.set_ylabel('销量 (盒)') ax.set_title('各省区销售指标完成情况') ax.set_xticks([j + width/2 for j in range(len(dates))]) ax.set_xticklabels(dates) ax.legend() plt.show() ``` ### 相关问题 1. 如何处理存在多个连锁总部的数据场景? 2. 当月度指标为0时如何避免达成率计算错误?[^4] 3. 如何扩展按季度维度的指标分析? 4. 省区名称映射不一致时如何建立对照表? 5. 大数据量下如何优化窗口函数的性能?[^5]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kkk我是谁

谢谢!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值