Sql 为什么我会犯错误;不是通过表达式“分组”吗;?

Sql 为什么我会犯错误;不是通过表达式“分组”吗;?,sql,oracle,oracle11g,Sql,Oracle,Oracle11g,我试图用sql获取项目中的工作人员数量,但查询的group by part有一些错误。我有一个单独的表(workersonprojects),它将项目id-s与处理它的工人相匹配。查询应选择所有内容+一个项目的工人数量 SELECT projectid, name, developerleader, consultantleader, projectleader, budget, count(workerid) AS workers FROM projects JOIN workersonpro

我试图用sql获取项目中的工作人员数量,但查询的group by part有一些错误。我有一个单独的表(workersonprojects),它将项目id-s与处理它的工人相匹配。查询应选择所有内容+一个项目的工人数量

SELECT projectid, name, developerleader, consultantleader, projectleader, budget, count(workerid) AS workers
FROM projects
JOIN workersonprojects on (projectid=project)
JOIN workers on (worker=workerid)
GROUP BY projectid;

您正在使用聚合函数:
COUNT()
。您必须按
COUNT()

以外的所有列进行分组,这是因为您没有将select列表中的所有列都包含到
group by
子句中,这可以从查询
group by projectid中看到。您应该像这样更改查询

SELECT p.projectid, 
name, 
developerleader, 
consultantleader, 
projectleader, 
budget,
xxx.workers
FROM projects p
JOIN workersonprojects wp on p.projectid= wp.project
JOIN workers w on p.worker= w.workerid
JOIN (select projectid, count(workerid) AS workers
FROM projects
GROUP BY projectid ) xxx ON p.projectid = xxx.projectid;

根据其他答复:

选择projectid、name、developerleader、consultantleader、projectleader、budget、count(workerid)作为工作人员 来自项目 在(projectd=project)上加入Workerson项目 在上加入工人(工人=工人ID)
分组依据projectid、姓名、developerleader、consultantleader、projectleader、预算在分组依据查询中,您必须定义所需表的“projectid”

SELECT workersonprojects.projectid, projects.name, 
projects.developerleader, projects.consultantleader, projects.projectleader,
projects.budget, 
count(workersonprojects.workerid) AS workers
FROM projects
JOIN workersonprojects on 
(workersonprojects.projectid=projects.projectid)
JOIN workers on (workers.worker=workersonprojects.workerid)
GROUP BY workersonprojects.projectid;

基本上,对于GROUPBY子句,您需要包括GROUPBY子句中未在任何聚合函数中使用的所有列。在本例中,您选择了projectid、name、developerleader、consultantleader、projectleader、budget列,但COUNT()函数中只有一列。所以在SELECT子句中包含这些列,这样您就有了一个有效的查询

SELECT projectid,
  name,
  developerleader,
  consultantleader,
  projectleader,
  budget,
  COUNT(workerid) AS workers
FROM projects
JOIN workersonprojects
ON (projectid=project)
JOIN workers
ON (worker=workerid)
GROUP BY PROJECTID,
  name,
  developerleader,
  consultantleader,
  projectleader,
  budget;

您必须使用所有给定的select语句属性按分组,因此请给出select语句中选择的所有属性。

因为您只能使用select中的列,这些列位于group by语句或聚合函数PROJECTID中的什么?你需要告诉小组。projects.projectd常规GROUP BY规则规定:如果指定了GROUP BY子句,则SELECT列表中的每个列引用必须标识分组列或是集合函数的参数@jarlh:“常规”规则(如:SQL标准)将其扩展到:或所有非分组列的功能依赖于分组列。但不幸的是,Oracle不支持that@a_horse_with_no_name,大多数数据库管理系统不支持它。如果你遵循我的“一般规则”,你永远不会出错!