SQL查询修改需求:按连续年份统计各年度热门产品类别
调整SQL实现按连续年份统计年度热门产品类别
嘿,我来帮你把原查询改成按年度展示热门产品类别的版本,同时满足连续年份的筛选需求~
首先得指出原查询里的一个小错误:Products和Categories的关联条件写错了!应该用CategoryID关联,不是ProductID,这个错误会导致统计结果完全偏离,我会在下面的代码里直接修正。
接下来,要实现按年度统计,我们需要关联Orders表获取订单日期,提取年份作为分组维度,再加上连续年份的筛选逻辑。这里给你两种常用方案,按需选择:
方案1:指定明确的连续年份区间
如果你已经知道要统计的连续年份范围(比如2020-2022年),直接在WHERE子句里限定年份就行,简单直接:
SELECT YEAR(o.OrderDate) AS OrderYear, c.CategoryName, SUM(od.Quantity) AS TotalQuantity FROM [Order Details] od INNER JOIN Products p ON od.ProductID = p.ProductID INNER JOIN Categories c ON p.CategoryID = c.CategoryID -- 修正原查询的关联错误 INNER JOIN Orders o ON od.OrderID = o.OrderID -- 新增关联Orders表获取订单年份 WHERE YEAR(o.OrderDate) BETWEEN 2020 AND 2022 -- 指定连续年份区间 GROUP BY YEAR(o.OrderDate), c.CategoryName ORDER BY YEAR(o.OrderDate) ASC, TotalQuantity DESC;
方案2:自动筛选有订单数据的连续年份
如果需要自动识别数据库中存在订单的最长连续年份区间(比如最近3个连续有订单的年份),可以用CTE先找出目标年份范围,再统计数据:
WITH YearRange AS ( -- 先提取所有有订单的年份 SELECT DISTINCT YEAR(o.OrderDate) AS OrderYear FROM Orders o ), ConsecutiveGroups AS ( -- 给连续的年份打上相同的分组ID SELECT OrderYear, OrderYear - ROW_NUMBER() OVER (ORDER BY OrderYear) AS GroupID FROM YearRange ), TargetYears AS ( -- 筛选出最长的连续年份区间 SELECT OrderYear FROM ConsecutiveGroups GROUP BY GroupID HAVING COUNT(*) = (SELECT MAX(COUNT(*)) FROM ConsecutiveGroups GROUP BY GroupID) ) SELECT ty.OrderYear, c.CategoryName, SUM(od.Quantity) AS TotalQuantity FROM [Order Details] od INNER JOIN Products p ON od.ProductID = p.ProductID INNER JOIN Categories c ON p.CategoryID = c.CategoryID INNER JOIN Orders o ON od.OrderID = o.OrderID INNER JOIN TargetYears ty ON YEAR(o.OrderDate) = ty.OrderYear GROUP BY ty.OrderYear, c.CategoryName ORDER BY ty.OrderYear ASC, TotalQuantity DESC;
关键改动说明
- 修正关联错误:把原查询中
Products和Categories错误的关联条件改成了p.CategoryID = c.CategoryID,保证类别关联正确。 - 新增年份维度:通过
YEAR(o.OrderDate)提取订单年份,将其加入分组和排序,实现按年度拆分统计。 - 连续年份筛选:两种方案分别对应“已知区间”和“自动识别”的场景,覆盖不同业务需求。
内容的提问来源于stack exchange,提问作者DoktorAgon
相关产品推荐
相关产品推荐

