当前位置: 首页 > java >正文

通过门店销售明细表用SQL得到每月每个门店的销冠和按月的同比环比数据

假设我在Snowflake里有销售表,包含ID主键、门店ID、日期、销售员姓名和销售额,需要统计出每个月所有门店和各门店销售额最高的人,不一定是一个人,以及他所在的门店ID和月总销售额。

统计每个月份下,各门店内销售额最高的销售员(可能多人并列),并显示其在该门店的月总销售额。


分步说明:

  1. 按门店+月份+销售员汇总销售额
    计算每个销售员在每个门店的月总销售额。

  2. 确定各门店内的最高销售额
    按月份和门店分组,找到每个门店当月的最高销售额。

  3. 关联最高销售额的销售员
    匹配每个门店中达到最高销售额的销售员(允许多个并列)。


SQL 代码:

WITH 门店销售员明细 AS (SELECTDATE_TRUNC('MONTH', 日期) AS 月份,门店ID,销售员姓名,SUM(销售额) AS 月总销售额FROM 销售表GROUP BY 月份, 门店ID, 销售员姓名
),
各门店最高销售额 AS (SELECT月份,门店ID,MAX(月总销售额) AS 最高销售额FROM 门店销售员明细GROUP BY 月份, 门店ID
)
SELECTsm.月份,sm.门店ID,sm.销售员姓名,sm.月总销售额
FROM 门店销售员明细 sm
JOIN 各门店最高销售额 mhON sm.月份 = mh.月份AND sm.门店ID = mh.门店IDAND sm.月总销售额 = mh.最高销售额
ORDER BY sm.月份, sm.门店ID;

输出结果:

月份门店ID销售员姓名月总销售额
2023-01-01001张三50000
2023-01-01002李四48000
2023-01-01002王五48000
2023-02-01001赵六52000

关键点解释:

  1. 门店销售员明细
    月份 + 门店 + 销售员 汇总销售额,确保每个销售员在单店的表现独立统计。

  2. 各门店最高销售额
    通过 GROUP BY 月份, 门店ID 找到每个门店当月的最高销售额阈值。

  3. 最终匹配
    通过 JOIN 将明细与最高销售额关联,精确筛选出每个门店的优胜者(含并列情况)。


扩展说明:

  • 并列处理:若多个销售员在同一门店的销售额相同且为最高,结果中将全部列出。
  • 性能优化:Snowflake的列式存储和自动分区优化可高效处理此类聚合查询。
  • 动态调整:如需排除零销售额门店,可在明细中增加 HAVING SUM(销售额) > 0

假设我在Snowflake里有销售表,包含ID主键、门店ID、日期、销售员姓名和销售额,需要统计出按月统计的同比和环比数据,当前月如果不是月底的话,同比或环比数据需要取得上个月或者去年1日到对应的日期的总销售额值。

解决方案:

按月统计销售额的同比(去年同期)和环比(上月同期)数据,动态处理未完整月份(如当前月未结束时,同比环比均取相同天数范围)。


分步说明:

  1. 计算每个月的实际日期范围
    动态确定每个月的起始日期和截止日期(若当前月未结束,取到当前日)。

  2. 生成同比环比对比日期范围
    根据当前月实际天数,生成上月和去年同期的对应日期范围(自动处理闰年等边界)。

  3. 关联数据计算销售额
    将当前月、上月、去年同期三个范围的销售额关联到同一行。


SQL 代码:

WITH
-- 1. 获取所有存在的月份
所有月份 AS (SELECT DISTINCT DATE_TRUNC('MONTH', 日期) AS 月份FROM 销售表
),-- 2. 计算每个月的实际起止日期(若为当前月则截止到今日)
月份日期范围 AS (SELECT月份,月份 AS 当月起始日期,LEAST(DATEADD(DAY, -1, DATEADD(MONTH, 1, 月份)),  -- 自然月最后一天CURRENT_DATE()                              -- 若为当前月则截止到今日) AS 当月截止日期FROM 所有月份
),-- 3. 计算每个月的实际天数(用于生成同比环比范围)
月份天数 AS (SELECT月份,当月起始日期,当月截止日期,DATEDIFF(DAY, 当月起始日期, 当月截止日期) + 1 AS 当月天数FROM 月份日期范围
),-- 4. 生成上月同期范围(自动处理天数溢出)
上月范围 AS (SELECT月份,DATEADD(MONTH, -1, 当月起始日期) AS 上月起始日期,LEAST(DATEADD(DAY, 当月天数 -1, DATEADD(MONTH, -1, 当月起始日期)),  -- 上月起始 + 相同天数DATEADD(DAY, -1, DATEADD(MONTH, 1, DATEADD(MONTH, -1, 当月起始日期)))  -- 上月自然最后一天) AS 上月截止日期FROM 月份天数
),-- 5. 生成去年同期范围(自动处理闰年)
去年范围 AS (SELECT月份,DATEADD(YEAR, -1, 当月起始日期) AS 去年起始日期,LEAST(DATEADD(DAY, 当月天数 -1, DATEADD(YEAR, -1, 当月起始日期)),  -- 去年起始 + 相同天数DATEADD(DAY, -1, DATEADD(MONTH, 1, DATEADD(YEAR, -1, 当月起始日期)))  -- 去年自然最后一天) AS 去年截止日期FROM 月份天数
),-- 6. 计算各范围销售额
当月销售额 AS (SELECTm.月份,SUM(销售额) AS 当月销售额FROM 月份日期范围 mJOIN 销售表 s ON s.日期 BETWEEN m.当月起始日期 AND m.当月截止日期GROUP BY m.月份
),
上月销售额 AS (SELECTp.月份,SUM(销售额) AS 上月销售额FROM 上月范围 pJOIN 销售表 s ON s.日期 BETWEEN p.上月起始日期 AND p.上月截止日期GROUP BY p.月份
),
去年销售额 AS (SELECTy.月份,SUM(销售额) AS 去年销售额FROM 去年范围 yJOIN 销售表 s ON s.日期 BETWEEN y.去年起始日期 AND y.去年截止日期GROUP BY y.月份
)-- 7. 最终关联结果
SELECTcurr.月份,curr.当月销售额,prev.上月销售额,prev.上月销售额 / NULLIF(curr.当月销售额, 0) -1 AS 环比增长率,  -- 可选:计算增长率last_year.去年销售额,last_year.去年销售额 / NULLIF(curr.当月销售额, 0) -1 AS 同比增长率  -- 可选:计算增长率
FROM 当月销售额 curr
LEFT JOIN 上月销售额 prev ON curr.月份 = prev.月份
LEFT JOIN 去年销售额 last_year ON curr.月份 = last_year.月份
ORDER BY curr.月份;

输出示例:

月份当月销售额上月销售额环比增长率去年销售额同比增长率
2023-03-011500001400000.07141200000.25
2023-04-018000090000-0.1111700000.1429

关键逻辑说明:

  1. 动态日期范围

    • 若当前月未结束(如今天是3月15日),则统计 3月1日~3月15日 的数据。
    • 环比取 2月1日~2月15日,同比取 去年3月1日~3月15日
  2. 闰年与月末处理

    • 当对比日期超出目标月实际天数时(如:当前月结束于31日,但目标月只有30日),自动截断到目标月最后一天。
  3. 增长率计算(可选)

    • 使用 NULLIF 避免除零错误,确保分母不为零时计算增长率。

扩展建议:

  • 性能优化:Snowflake的自动分区和集群键(如按 日期 分区)可加速范围查询。
  • 空值处理:使用 COALESCE(上月销售额, 0) 等函数处理无对比数据的情况。
http://www.xdnf.cn/news/2211.html

相关文章:

  • 可视化性能分析工具火焰图
  • function,bind,lambda的用法
  • Claude系列模型-20250426
  • Android12源码编译及刷机
  • JavaWeb——案例(14/x)- 文件上传-阿里云OSS-准备(阿里云 OSS 简介、使用阿里云 OSS 的流程、关键准备工作)
  • 【含文档+PPT+源码】基于Django框架的乡村绿色农产品交易平台的设计与实现
  • DeepSeek预训练追求极致的训练效率的做法
  • 【分布式系统中的“瑞士军刀”_ Zookeeper】二、Zookeeper 核心功能深度剖析与技术实现细节
  • 818协议知识笔记
  • ShaderToy学习笔记 03.多个形状和旋转
  • DHCP配置文件详解
  • 解决conda虚拟环境安装包却依旧安装到base环境下
  • AEB法规升级后的市场预测与分析:技术迭代、政策驱动与产业变革
  • 链接文件及功能安全:英飞凌官方文档摘录 - 基于Tasking与AURIX TC3xx MCAL中Link文件解析以及代码变量定位方法详解
  • C++学习:六个月从基础到就业——STL:分配器与设计原理
  • 一种滑窗像素自差值的深度学习损失函数
  • MySQL主从数据库配置教程
  • 谈谈关于【枚举】类型变量的好处
  • ARM架构的微控制器总线矩阵优先级与配置
  • SpringMVC
  • OpenFeign 日志配置
  • 在应用运维过程中,业务数据修改的证据留存和数据留存
  • 62.不同路径
  • Android移动应用开发:创建计算器
  • 模型 隐含前提
  • 【后端】主从单体数据库故障自动切换,容灾与高可用
  • Jest 快照测试
  • 前端面试 HTML篇
  • vue中 vue.config.js反向代理
  • 元数据驱动的 AI 开发:从数据目录到模型训练自动化