通过门店销售明细表用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.mzph.cn/bicheng/78999.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

移远通信LG69T赋能零跑B10:高精度定位护航,共赴汽车智联未来

当前,汽车行业正以前所未有的速度迈向智能化时代,组合辅助驾驶技术已然成为车厂突出重围的关键所在。高精度定位技术作为实现车辆精准感知与高效协同的基石,其重要性日益凸显。 作为全球领先的物联网及车联网整体解决方案供应商,移…

jmeter-Beashell获取http请求体json

在JMeter中,使用BeanShell处理器或BeanShell Sampler来获取HTTP请求体中的JSON数据是很常见的需求。这通常用于在测试计划中处理和修改请求体,或者在响应后进行验证。以下是一些步骤和示例代码,帮助你使用BeanShell来获取HTTP请求体中的JSON数…

若干查找算法

一、顺序查找 1.原理 2.代码 #if 0 const int FindBySeq(const vector<int>& ListSeq, const int KeyData) {int retrIdx -1;int size ListSeq.size();for(int i 0; i < size; i) {if (ListSeq.at(i) KeyData){retrIdx i;break;}}return retrIdx; } #else c…

Uniapp(vue):生命周期

目录 一、Vue生命周期二、Uniapp中页面的生命周期三、执行顺序比较一、Vue生命周期 setup():是在beforeCreate和created之前运行的,所以可以用setup代替这两个钩子函数。onBeforeMount():已经完成了模板的编译,但是组件还未挂载到DOM上的函数。onMounted():组件挂载到DOM完…

Prometheus监控

1、docker - prometheusgrafana监控与集成到spring boot 服务_grafana spring boot-CSDN博客 2、【IT运维】普罗米修斯基本介绍及监控平台部署&#xff08;PrometheusGrafana&#xff09;-CSDN博客 3、Prometheus监控SpringBoot-CSDN博客 4、springboot集成普罗米修斯-CSDN博客…

C#进阶学习(十四)反射的概念以及关键类Type

目录 本文末尾有相关类中的总结&#xff0c;如有需要直接跳到最后即可 前置知识&#xff1a; 1、程序集&#xff08;Assembly&#xff09; 2、元数据&#xff08;Metadata&#xff09; 3、中间语言&#xff08;IL, Intermediate Language&#xff09; 中间语言&#xff08;…

Kotlin中的also、apply、invoke用法详解

以下是 Kotlin 中作用域函数(let、run、with、also、apply)和 invoke 操作符的完整总结,结合代码示例和对比说明,帮助您理解它们的用法和区别。 一、作用域函数:简化对象操作 作用域函数用于在对象的上下文中执行代码块,并根据函数的不同返回对象本身或 lambda 的结果。…

Ubuntu实现远程文件传输

目录 安装 FileZillaUbuntu 配套设置实现文件传输 在Ubuntu系统中&#xff0c;实现远程文件传输的方法有多种&#xff0c;常见的包括使用SSH&#xff08;Secure Shell&#xff09;的SCP&#xff08;Secure Copy Protocol&#xff09;命令、SFTP&#xff08;SSH File Transfer P…

TEC制冷片详解(STM32)

目录 一、介绍 二、传感器原理 1.原理图 2.引脚描述 三、程序设计 main文件 jdq.h文件 jdq.c文件 四、实验效果 五、资料获取 项目分享 一、介绍 半导体制冷片&#xff08;又称热电模块&#xff09;&#xff0c;是利用半导体材料的珀耳帖效应制造的一种新型制冷元件…

DotNet 入门:(一) 环境安装

一、前言 本想用 Go 语言实现一个通过小爱同学操作电脑的&#xff0c;比如我对着手机说打开音乐&#xff0c;或调小音乐&#xff0c;电脑能做相应的处理。奈何我一时间没看懂&#xff0c;就想着用.Net 来试一下&#xff0c;于是就有了下面这篇文章。 二、安装.Net 环境 1. 下…

人工智能数学基础(四):线性代数

线性代数是人工智能领域的核心数学工具之一&#xff0c;广泛应用于数据表示、模型训练和算法优化等多个环节。本文将系统梳理线性代数的关键知识点&#xff0c;并结合 Python 实例&#xff0c;助力读者轻松掌握这一重要学科。资源绑定附上完整资源供读者参考学习&#xff01; …

Github 2025-04-26 Rust开源项目日报Top10

根据Github Trendings的统计,今日(2025-04-26统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Rust项目10Dart项目1RustDesk: 用Rust编写的开源远程桌面软件 创建周期:1218 天开发语言:Rust, Dart协议类型:GNU Affero General Public Li…

使用org.java_websocket库第三方库实现广播

可以使用org.java_websocket库来实现WebSocket服务器&#xff0c;并通过broadcast方法实现广播 java实现 import org.java_websocket.WebSocket; import org.java_websocket.handshake.ClientHandshake; import org.java_websocket.server.WebSocketServer; import java.net.…

【自然语言处理与大模型】LangChain大模型应用框架入门②

本文介绍LangChain的另一个重要组件——提示词模板&#xff08;Prompt Template&#xff09;组件&#xff0c;它主要用于将用户输入和参数转换为语言模型可理解的指令。有助于引导模型生成符合预期的响应&#xff0c;帮助其更好地理解上下文&#xff0c;从而输出相关且连贯的语…

单例设计模式之懒汉式以及线程安全问题

在单例设计模式中&#xff0c;懒汉式&#xff08;Lazy Initialization&#xff09; 通过延迟实例化来优化资源使用&#xff0c;但在多线程环境下存在线程安全问题。以下是其核心问题及解决方案的详细解析&#xff1a; 一、基础懒汉式代码&#xff08;线程不安全&#xff09; pu…

Windows7升级PowerShell到5.1

window7系统&#xff0c;安装了vs2019后&#xff0c;应用要用到PowerShell&#xff0c;Tool->Commond Line->Developer PowerShell时&#xff0c;提示版本需要3.0以上。还有编译新版本vcpkg&#xff08;2021前的版本&#xff09;&#xff0c;脚本报错。所以需要升级下Pow…

区块链:去中心化应用(DApp)开发全流程解析

一、DApp的核心概念与特点 去中心化应用&#xff08;DApp&#xff09;是一种基于区块链技术的应用程序&#xff0c;其核心逻辑通过智能合约在链上执行&#xff0c;数据存储和交互均不依赖中心化服务器。相比传统应用&#xff0c;DApp具备以下特点&#xff1a; 去中心化&#x…

跟我学C++中级篇——控制死锁

一、同步和死锁 在前面学习多线程和网络编程时&#xff0c;都对线程中数据的同步和数据结构多线程访问的安全问题进行了分析和说明。其实&#xff0c;多线程编程之所以难&#xff0c;难点之一就在这里&#xff0c;数据同步意味着效率和安全的平衡&#xff0c;而这里的安全有一…

【matlab】绘制maxENT模型的ROC曲线和omission curve

文章目录 一、maxENT模型二、ROC曲线三、实操3.1 数据提取3.2 绘制ROC曲线3.3 绘制遗漏曲线3.4 多次训练的ROC和测试的ROC 一、maxENT模型 前面的文章已经详细讲过了。 maxENT软件运行后&#xff0c;会生成一个html报告&#xff0c;里面有ROC曲线&#xff0c;但我们往往需要自…

nginx 核心功能

目录 一、基于授权的访问控制 1. 使用 htpasswd 生成用户认证文件 2. 修改 Nginx 主配置文件 二、基于客户端的访问控制 三、Nginx 虚拟主机 1. 基于域名的虚拟主机 2. 基于 IP 的虚拟主机 3. 基于端口的虚拟主机 四、LNMP 架构部署及应用 1. 安装 MariaDB 2. 安装并…