You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从三张表计算月度销售增长率?SQL实现求助

月度销售总额及增长率计算实现指导

需要从Table1、Table2、Table3三张数据表中计算月度销售总额及销售增长率。

三张表数据如下:
Table1

MonthAmount
Sep 20232.00
Oct 20233.00
Oct 20231.00

Table2

MonthAmount
Sep 20231.00
Oct 20232.00
Oct 20232.00

Table3

MonthAmount
Sep 20235.00
Oct 20232.00
Oct 20231.00

你提供的SQL代码问题

WITH CTE AS (
SELECT OrderDate, Amount FROM Table1 
    UNION ALL 
SELECT OrderDate, Amount FROM Table2 
    UNION ALL SELECT OrderDate, Amount FROM Table3)
SELECT 
    Datepart(Month, OrderDate) as 
    monthly_sales, Sum(Amount) As monthly_sales FROM  CTE Group by Datepart(Month, OrderDate),
CTE2 AS (SELECT *,  lag(monthly_sales) over (order by Month ) as prev_month_sales FROM CTE ), 
CTE3 AS (SELECT     *,  100*(monthly_sales - prev_month_sales)/(prev_month_sales) as sales_growth FROM CTE2)
SELECT * from CTE3

这段代码存在多个问题:

  • 表中实际字段是Month,但代码误用了不存在的OrderDate字段
  • CTE语法错误:第一个CTE后的SELECT语句未正确闭合,直接定义CTE2会触发语法报错
  • 仅按月份数字分组,丢失年份信息,不同年份的同月数据会被错误合并
  • 逻辑错误:CTE2直接读取未分组的明细数据,无法基于月度总额计算环比

另外你给出的预期输出存在错误,同一个月份不应该出现多行数据,正确的月度总额应该每个月唯一一行。


正确实现代码

WITH CombinedData AS (
    -- 合并三张表的销售明细
    SELECT Month, Amount FROM Table1
    UNION ALL
    SELECT Month, Amount FROM Table2
    UNION ALL
    SELECT Month, Amount FROM Table3
),
MonthlySales AS (
    -- 计算月度销售总额并按时间排序
    SELECT 
        Month,
        SUM(Amount) AS monthly_sales
    FROM CombinedData
    GROUP BY Month
    ORDER BY CONVERT(DATE, Month + ' 01') -- 转换为日期确保月份排序正确
),
SalesWithPrev AS (
    -- 获取上月销售总额,处理首月无上月数据的情况
    SELECT 
        Month,
        monthly_sales,
        COALESCE(LAG(monthly_sales) OVER (ORDER BY CONVERT(DATE, Month + ' 01')), 0) AS prev_month_sales
    FROM MonthlySales
)
-- 计算增长率,避免除零错误
SELECT 
    Month,
    monthly_sales,
    prev_month_sales,
    CASE 
        WHEN prev_month_sales = 0 THEN 0 -- 首月无上月数据,增长率设为0
        ELSE ROUND(100 * (monthly_sales - prev_month_sales) / prev_month_sales, 2) 
    END AS sales_growth
FROM SalesWithPrev;

正确输出结果

Sales growth

Monthmonthly_salesprev_month_salessales_growth
Sep 20238.0000.00
Oct 202311.008.0037.50

代码说明

  1. CombinedData:合并三张表的所有销售明细,保留Month和Amount字段
  2. MonthlySales:按Month分组计算月度销售总额,通过日期转换确保月份按时间顺序排序
  3. SalesWithPrev:使用LAG函数获取上月销售总额,用COALESCE将首月的上月值设为0
  4. 最终查询:通过CASE语句处理除零错误,计算并保留两位小数的增长率

内容的提问来源于stack exchange,提问作者User_K47

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 01:12:13