列在选择列表中无效的原因是它未包含在聚合函数或 GROUP BY 子句中
P粉517090748
P粉517090748 2023-08-23 14:36:31
0
2
653
<p>我收到一个错误 - </p> <blockquote> <p>列“Employee.EmpID”在选择列表中无效,因为它是 不包含在聚合函数或 GROUP BY 子句中。</p> </blockquote> <hr /> <pre class="brush:php;toolbar:false;">select loc.LocationID, emp.EmpID from Employee as emp full join Location as loc on emp.LocationID = loc.LocationID group by loc.LocationID</pre> <p>这种情况符合 Bill Karwin 给出的答案。</p> <p>对上述内容的更正,适合 ExactaBox 的答案 - </p> <pre class="brush:php;toolbar:false;">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</pre> <hr /> <p><strong>原始问题 -</strong></p> <p>对于 SQL 查询 -</p> <pre class="brush:php;toolbar:false;">select * from Employee as emp full join Location as loc on emp.LocationID = loc.LocationID group by (loc.LocationID)</pre> <p>我不明白为什么会出现此错误。我想要做的就是连接表,然后将特定位置的所有员工分组在一起。 </p> <p><strong>我想我对自己的问题有了部分解释。告诉我是否可以 -</strong> </p> <p>要将在同一地点工作的所有员工分组,我们必须首先提及 LocationID。 </p> <p>然后,我们不能/不提及旁边的每个员工 ID。相反,我们提到该地点的员工总数,即我们应该对在该地点工作的员工进行 SUM()。我不确定为什么我们要采用后一种方式。 因此,这解释了错误的“它不包含在任一聚合函数中”部分。</p> <p>错误的 <strong><code>GROUP BY</code></strong> 子句部分的解释是什么?</p>
P粉517090748
P粉517090748

全部回复(2)
P粉155832941

如果您设置禁用 ONLY_FULL_GROUP_BY 服务器模式(默认情况下),您的查询将在 MYSQL 中运行。但在本例中,您使用的是不同的 RDBMS。因此,为了使您的查询正常工作,请将所有非聚合列添加到您的GROUP BY子句中,例如

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

非聚合列意味着该列不会传递到聚合函数,例如 SUMMAXCOUNT 等。

P粉090087228

假设我有下表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
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板