如何从三张表计算月度销售增长率?SQL实现求助
月度销售总额及增长率计算实现指导
需要从Table1、Table2、Table3三张数据表中计算月度销售总额及销售增长率。
三张表数据如下:
Table1
| Month | Amount |
|---|---|
| Sep 2023 | 2.00 |
| Oct 2023 | 3.00 |
| Oct 2023 | 1.00 |
Table2
| Month | Amount |
|---|---|
| Sep 2023 | 1.00 |
| Oct 2023 | 2.00 |
| Oct 2023 | 2.00 |
Table3
| Month | Amount |
|---|---|
| Sep 2023 | 5.00 |
| Oct 2023 | 2.00 |
| Oct 2023 | 1.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
| Month | monthly_sales | prev_month_sales | sales_growth |
|---|---|---|---|
| Sep 2023 | 8.00 | 0 | 0.00 |
| Oct 2023 | 11.00 | 8.00 | 37.50 |
代码说明
- CombinedData:合并三张表的所有销售明细,保留
Month和Amount字段 - MonthlySales:按
Month分组计算月度销售总额,通过日期转换确保月份按时间顺序排序 - SalesWithPrev:使用
LAG函数获取上月销售总额,用COALESCE将首月的上月值设为0 - 最终查询:通过CASE语句处理除零错误,计算并保留两位小数的增长率
内容的提问来源于stack exchange,提问作者User_K47
相关产品推荐
相关产品推荐

