列在选择列表中无效的原因是它未包含在聚合函数或 GROUP BY 子句中
P粉517090748
2023-08-23 14:36:31
<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>
如果您设置禁用
ONLY_FULL_GROUP_BY
服务器模式(默认情况下),您的查询将在MYSQL
中运行。但在本例中,您使用的是不同的 RDBMS。因此,为了使您的查询正常工作,请将所有非聚合列添加到您的GROUP BY
子句中,例如非聚合列意味着该列不会传递到聚合函数,例如
SUM
、MAX
、COUNT
等。假设我有下表
T
:我执行以下查询:
输出应有两行,一行为
a=1
,第二行为a=2
。但是 b 的值应该在这两行中显示什么呢?每种情况都有三种可能性,查询中没有任何内容明确说明为每组中的 b 选择哪个值。意思很模糊。
这演示了单值规则,该规则禁止在运行 GROUP BY 查询时获得未定义的结果,并且在选择列表中包含不属于分组的任何列标准,也不会出现在聚合函数(SUM、MIN、MAX 等)中。
修复它可能如下所示:
现在很明显您想要以下结果: