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

如何查询过去一年销量Top10的商品?需使用dateadd函数

问题解决:使用DATEADD获取过去一年销量TOP10商品列表

原代码存在的问题

  • 日期条件逻辑错误:YEAR(GETDATE())-1返回的是年份数字(如2023),无法与日期类型的@date直接比较
  • GROUP BY语法不符合规范:包含了未做聚合处理的Quantity和DocDate字段
  • 未统计商品总销量:缺少对Quantity的SUM聚合操作
  • 未限制结果为TOP10商品

修正后的代码(含DATEADD与参数化日期范围)

SELECT TOP 10
    RDR1.ItemCode AS [ItemCode],
    SUM(RDR1.Quantity) AS [TotalSalesQuantity],
    YEAR(MAX(RDR1.DocDate)) AS [SalesYear]
FROM 
    ORDR
INNER JOIN 
    RDR1 ON ORDR.DocEntry = RDR1.DocEntry
WHERE 
    -- 使用DATEADD计算过去一年的起始日期,结合参数灵活控制时间范围
    RDR1.DocDate BETWEEN DATEADD(YEAR, -1, @DateTo) AND @DateTo
GROUP BY 
    RDR1.ItemCode
ORDER BY 
    [TotalSalesQuantity] DESC

关键说明

  1. DATEADD的使用:DATEADD(YEAR, -1, @DateTo)自动计算出@DateTo往前推一年的日期,完全满足必须使用DATEADD的要求
  2. 参数化日期:通过@DateTo参数可以自定义时间范围的结束点(比如设为GETDATE()表示当前日期),起始日期由DATEADD动态生成
  3. 聚合与分组:仅按ItemCode分组,用SUM(RDR1.Quantity)统计商品总销量,避免GROUP BY语法错误
  4. TOP10限制:用TOP 10直接筛选销量排名前十的商品

简化版(直接使用当前日期作为结束点)

如果不需要自定义@DateTo参数,也可以直接写死日期范围:

SELECT TOP 10
    RDR1.ItemCode AS [ItemCode],
    SUM(RDR1.Quantity) AS [TotalSalesQuantity]
FROM 
    ORDR
INNER JOIN 
    RDR1 ON ORDR.DocEntry = RDR1.DocEntry
WHERE 
    RDR1.DocDate BETWEEN DATEADD(YEAR, -1, GETDATE()) AND GETDATE()
GROUP BY 
    RDR1.ItemCode
ORDER BY 
    [TotalSalesQuantity] DESC

内容的提问来源于stack exchange,提问作者O.T

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 15:09:13