如何修复"列无效,因为它不包含在聚合函数或GROUP By子句中"

Ult*_*raJ 0 sql sql-server

我正在尝试从两个表中提取数据,这些表计算每个客户端的订单数量.下面的SQL在没有输入S.Name的情况下工作正常SELECT,但我希望输出中的客户端名称比其StoreID更有意义.当我添加S.Name时,我收到以下错误:

列'uStores.Name'在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中.

SELECT O.StoreID, COUNT(O.StoreID) AS OrderCount, S.Name
FROM Orders AS O
JOIN Stores AS ON O.StoreID = S.StoreID
GROUP BY O.StoreID
ORDER BY OrderCount DESC
Run Code Online (Sandbox Code Playgroud)

如何使此查询有效?

Boh*_*ian 6

您必须在列表中包括所有非聚合列; 你选择了S.Name,这不是聚合但不在GROUP BY:

SELECT O.StoreID, COUNT(O.StoreID) AS OrderCount, S.Name
FROM Orders AS O
JOIN Stores AS S ON O.StoreID = S.StoreID
GROUP BY O.StoreID, S.Name -- Added "S.Name" to the GROUP BY list
ORDER BY OrderCount DESC
Run Code Online (Sandbox Code Playgroud)

肥皂盒时间:该group by子句的整个概念是无用的,因为它是完全确定的 - 即对于给定的选择列表只有一个有效的表达式(忽略列表的功能相同的排列),那么为什么需要呢?为什么查询解析器不假设它 - 它检查它是否正确,但它只能是一件事,所以它已经完成了自己生成它所需的所有工作.

具有讽刺意味的是,关于语言的这一事实本质上打破了3NF - 即group by子句是查询本身的冗余数据(可以从查询的其他部分确定).从数据的角度来看,如果按照自己的标准衡量,语言将被视为"设计糟糕".