我试图从两个表中提取数据,这些表计算每个客户端的订单数量。如果S.Name
中没有SELECT
,下面的SQL工作正常,但我希望输出中客户端的名称比其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
如何使此查询有效?
答案 0 :(得分: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
肥皂盒时间:group by
子句的整个概念是无用的,因为它是完全确定的 - 即对于给定的选择列表只有一个有效的表达式组(忽略列表的功能相同的排列),所以为什么需要?为什么查询解析器不假设它 - 它检查它是否正确,但它只能是一件事,所以它已经完成了自己生成它所需的所有工作。
具有讽刺意味的是,关于语言的这个事实本质上打破了3NF - 即group by子句是查询本身的冗余数据(可以从查询的其他部分确定)。从数据的角度来看,如果按照自己的标准衡量,语言将被视为“设计糟糕”。
答案 1 :(得分:0)
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
ORDER BY OrderCount DESC
当你使用count或sum等函数时,你应该按所有字段分组,在你的情况下O.StoreID, S.Name
了解更多信息