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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 11:12:41