如何用SUM聚合函数结合dateadd()生成近6个月、1年、2年销售列?
多时间段销售聚合统计的SQL实现方案
核心思路是用条件聚合:在SUM()函数里嵌套CASE WHEN判断销售日期是否落在目标区间,结合dateadd()(或对应数据库的日期函数)计算时间阈值,符合条件的销售额累加,不符合的记0,最终按Item#分组得到三列聚合结果。
适用于SQL Server的示例代码
假设表B包含销售日期列SaleDate、销售额列Amount,表A与表B通过Item#关联:
SELECT a.[Item#], -- 统计近6个月的销售总和 SUM(CASE WHEN b.SaleDate >= DATEADD(month, -6, GETDATE()) THEN b.Amount ELSE 0 END) AS [近6个月销售总和], -- 统计近1年的销售总和 SUM(CASE WHEN b.SaleDate >= DATEADD(month, -12, GETDATE()) THEN b.Amount ELSE 0 END) AS [近1年销售总和], -- 统计近2年的销售总和 SUM(CASE WHEN b.SaleDate >= DATEADD(month, -24, GETDATE()) THEN b.Amount ELSE 0 END) AS [近2年销售总和] FROM 表A a JOIN 表B b ON a.[Item#] = b.[Item#] GROUP BY a.[Item#] ORDER BY a.[Item#];
适用于MySQL的示例代码
MySQL里没有DATEADD(),改用DATE_SUB()函数,同时当前日期用CURDATE():
SELECT a.`Item#`, SUM(CASE WHEN b.SaleDate >= DATE_SUB(CURDATE(), INTERVAL 6 MONTH) THEN b.Amount ELSE 0 END) AS `近6个月销售总和`, SUM(CASE WHEN b.SaleDate >= DATE_SUB(CURDATE(), INTERVAL 12 MONTH) THEN b.Amount ELSE 0 END) AS `近1年销售总和`, SUM(CASE WHEN b.SaleDate >= DATE_SUB(CURDATE(), INTERVAL 24 MONTH) THEN b.Amount ELSE 0 END) AS `近2年销售总和` FROM 表A a JOIN 表B b ON a.`Item#` = b.`Item#` GROUP BY a.`Item#` ORDER BY a.`Item#`;
补充说明
- 如果销售日期是字符串类型,需要先转换为日期格式再比较,比如
CAST(b.SaleDate AS DATE)(SQL Server)或STR_TO_DATE(b.SaleDate, '%Y-%m-%d')(MySQL) - 若想让无销售记录的时间段显示
NULL而非0,去掉ELSE 0即可
内容的提问来源于stack exchange,提问作者mxrc
相关产品推荐
相关产品推荐

