Sql 列的原因在选择列表中无效,因为它未包含在聚合函数或GROUP BY子句中
我犯了个错误- 列“Employee.EmpID”在选择列表中无效,因为它是 不包含在聚合函数或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 =
这种情况符合比尔·卡温给出的答案 对上述内容的更正,符合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