如何查询过去一年销量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
关键说明
- DATEADD的使用:
DATEADD(YEAR, -1, @DateTo)自动计算出@DateTo往前推一年的日期,完全满足必须使用DATEADD的要求 - 参数化日期:通过
@DateTo参数可以自定义时间范围的结束点(比如设为GETDATE()表示当前日期),起始日期由DATEADD动态生成 - 聚合与分组:仅按
ItemCode分组,用SUM(RDR1.Quantity)统计商品总销量,避免GROUP BY语法错误 - 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
相关产品推荐
相关产品推荐

