You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

SQL Server关联表获取最大订单量对应食品名称的SQL报错问题

解决SQL Server中关联表获取订单量最大食品名称的问题

嗨,我来帮你搞定这个问题~咱们先弄明白为啥你原来的脚本会报错:

SQL Server有个严格的规则:SELECT列表里的非聚合列,要么包含在GROUP BY子句里,要么被聚合函数包裹。你原来的外层查询里,S.FoodName是普通列,但既没放在GROUP BY里,也没被聚合函数处理,同时你又用了MAX(S.OrderCount)这个聚合函数,数据库就懵了——它不知道该把哪个FoodName和全局最大的OrderCount对应起来,所以就抛出了那个错误。

不过你不想改用TOP和ORDER BY,想沿用当前的统计逻辑,那给你两种可行的修改方案:

方案一:用子查询匹配最大订单量

这种方式完全基于你原来的分组统计逻辑,先算出所有食品的订单量,再筛选出订单量等于全局最大值的记录:

SELECT S.FoodName, S.OrderCount
FROM (
    -- 你的原统计子查询,计算每个食品的总订单量
    SELECT FoodName, SUM(Number) AS OrderCount 
    FROM tblFactor 
    INNER JOIN tblDetail ON tblFactor.Factor_ID = tblDetail.Factor_ID 
    WHERE FactorDate = '2020-10-30' 
    GROUP BY FoodName
) S
-- 子查询算出全局最大订单量,用来筛选对应的食品
WHERE S.OrderCount = (
    SELECT MAX(OrderCount)
    FROM (
        SELECT SUM(Number) AS OrderCount 
        FROM tblFactor 
        INNER JOIN tblDetail ON tblFactor.Factor_ID = tblDetail.Factor_ID 
        WHERE FactorDate = '2020-10-30' 
        GROUP BY FoodName
    ) T
)

方案二:用窗口函数筛选排名第一的记录

如果存在多个食品订单量并列最大的情况,这个方案可以保留所有并列的记录(用RANK()),也可以只取其中一个(用ROW_NUMBER()),同样基于你的原统计逻辑:

SELECT FoodName, OrderCount
FROM (
    SELECT 
        FoodName, 
        SUM(Number) AS OrderCount,
        -- 按订单量降序排名,订单量相同的排名一致
        RANK() OVER(ORDER BY SUM(Number) DESC) AS RankNum
        -- 如果只想取其中一个,把RANK()换成ROW_NUMBER()即可
        -- ROW_NUMBER() OVER(ORDER BY SUM(Number) DESC) AS RowNum
    FROM tblFactor 
    INNER JOIN tblDetail ON tblFactor.Factor_ID = tblDetail.Factor_ID 
    WHERE FactorDate = '2020-10-30' 
    GROUP BY FoodName
) S
-- 筛选排名第一的记录
WHERE S.RankNum = 1

这两种方案都没有偏离你原来的分组统计思路,完美解决了你的问题~

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

火山引擎 最新活动