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

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;

关键改动说明

  1. 修正关联错误:把原查询中Products和Categories错误的关联条件改成了p.CategoryID = c.CategoryID,保证类别关联正确。
  2. 新增年份维度:通过YEAR(o.OrderDate)提取订单年份,将其加入分组和排序,实现按年度拆分统计。
  3. 连续年份筛选:两种方案分别对应“已知区间”和“自动识别”的场景,覆盖不同业务需求。

内容的提问来源于stack exchange,提问作者DoktorAgon

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:58:25