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




