Sql 列的原因在选择列表中无效,因为它未包含在聚合函数或GROUP BY子句中

Sql 列的原因在选择列表中无效,因为它未包含在聚合函数或GROUP BY子句中,sql,group-by,aggregate-functions,Sql,Group By,Aggregate Functions,我犯了个错误- 列“Employee.EmpID”在选择列表中无效,因为它是 不包含在聚合函数或GROUP BY子句中 这种情况符合比尔·卡温给出的答案 对上述内容的更正,符合ExactaBox- select loc.LocationID, count(emp.EmpID) -- not count(*), don't want to count nulls from Employee as emp full join Location as loc on emp.LocationID =

我犯了个错误-

列“Employee.EmpID”在选择列表中无效,因为它是 不包含在聚合函数或GROUP BY子句中


这种情况符合比尔·卡温给出的答案

对上述内容的更正,符合ExactaBox-

select loc.LocationID, count(emp.EmpID) -- not count(*), don't want to count nulls
from Employee as emp full join Location as loc 
on emp.LocationID = loc.LocationID
group by loc.LocationID 

原始问题-

对于SQL查询-

select *
from Employee as emp full join Location as loc 
on emp.LocationID = loc.LocationID
group by (loc.LocationID)
我不明白为什么我会犯这个错误。我所要做的就是连接这些表,然后将特定位置的所有员工分组在一起

我想我对自己的问题有部分解释。告诉我是否可以-

要将在同一地点工作的所有员工分组,我们必须首先提到LocationID

那么,我们不能/不在旁边提及每个员工ID。相反,我们提到的是该地点的雇员总数(即我们应该对在该地点工作的雇员总数求和)。我不知道我们为什么要用后一种方法。 因此,这解释了错误的“它既不包含在聚合函数中也不包含在聚合函数中”部分


错误的
GROUP BY
子句部分的解释是什么?

假设我有下表
T

a   b
--------
1   abc
1   def
1   ghi
2   jkl
2   mno
2   pqr
我执行以下查询:

SELECT a, b
FROM T
GROUP BY a
输出应该有两行,一行是
a=1
,第二行是
a=2

但是b的值应该在这两行中的每一行上显示什么呢?在每种情况下都有三种可能,查询中没有任何内容明确说明为每组中的b选择哪个值。这是模棱两可的

这演示了单值规则,该规则禁止在运行GROUP BY查询时获得未定义的结果,并且在选择列表中包含既不属于分组条件,也不出现在聚合函数(SUM、MIN、MAX等)中的任何列

修复它可能如下所示:

SELECT a, MAX(b) AS x
FROM T
GROUP BY a
现在很明显,您希望得到以下结果:

a   x
--------
1   ghi
2   pqr

基本上,这个错误的意思是,如果要使用
groupby
子句,那么结果将是一个关系/表,每个组有一行,因此在
SELECT
语句中只能“SELECT”您分组所依据的列,并对该列使用聚合函数,因为其他列不会出现在结果表中

“我想做的就是加入表格,然后将所有员工分组 在一个特定的地点一起。”

听起来您希望SQL语句的输出列出公司中的每个员工,但首先是阿纳海姆办公室的所有人员,然后是布法罗办公室的人员,然后是克利夫兰办公室的人员(A、B、C,明白了,显然我不知道您有哪些位置)


在这种情况下,请丢失GROUPBY语句。您所需要的就是按loc.LocationID排序。如果您设置为按服务器模式(默认情况下是)禁用
仅满组,则查询将在
MYSQL
中工作。但在本例中,您使用的是不同的RDBMS。因此,为了使查询正常工作,将所有非聚合列添加到
GROUPBY
子句中,例如

SELECT col1, col2, SUM(col3) totalSUM
FROM tableName
GROUP BY col1, col2

非聚合列意味着该列不会传递到聚合函数中,如
SUM
MAX
COUNT
等。当您使用group by时,您必须特别选择要分组的内容,您可能会将
group by
ORDER by
混淆。分组用于聚合列;排序就是对结果进行排序,这不是我的意思。order by将把所有员工一个接一个地放在同一个城市。它将为所有城市做到这一点。我需要知道一个城市有多少员工,而不是一个城市有哪些员工。有意义吗?然后将原始示例的第一行替换为:SELECT loc.LocationID,COUNT(*)是的,这就是我想要的。谢谢看来我没有正确地提出我的问题。但是,比尔·卡温的回答让我明白了错误背后的原因。所以我接受了他的建议。再次感谢。比尔-A放在一边-你说“不清楚在每组中为b选择哪个值”。为什么SQL不将b1、b2、b3全部放在该列中?@davidblaine,MySQL有一个函数组_CONCAT()。但在标准SQL中,每列只应包含一个值。这也是关系理论的基础。喜欢人们花时间用第一原则来解释。很好的解释,比尔。谢谢。我认为这是MSSQL的缺点,因为当我们有一些左连接并按右表的PK分组时,我们必须能够合理地轻松获得右表的列,而不会出现任何不明确的情况(MySQL处理这个问题)。@Postlagerkart,很高兴听到他们最终制作了一个聚合函数来完成这个普通任务。对于XML路径来说,这似乎总是一个丑陋的黑客。这就像一个具有多个内部连接的魅力。如何使用ef coreGood summary编写。我在这里发布了一个补充答案-
SELECT col1, col2, SUM(col3) totalSUM
FROM tableName
GROUP BY col1, col2