通過門店銷售明細表用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.pswp.cn/bicheng/78999.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/78999.shtml
英文地址,請注明出處:http://en.pswp.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. 安裝并…