SQL查询(联接的使用不正确?)

SQL查询(联接的使用不正确?),sql,oracle,Sql,Oracle,我正在尝试编写一个(Oracle)SQL查询,在给定“代理id”的情况下,它会给我一个代理在评估期间回答的问题列表,以及代理回答这些问题的所有时间的平均分数 注意:我试图设计查询,使其支持多个雇员(因此我们可以在商店级别查询),因此where子句中的“IN”条件 以下是我目前掌握的情况: select question.question_id as questionId, ((sum(answer.answer) / count(answer.answer)) * 100) as

我正在尝试编写一个(Oracle)SQL查询,在给定“代理id”的情况下,它会给我一个代理在评估期间回答的问题列表,以及代理回答这些问题的所有时间的平均分数

注意:我试图设计查询,使其支持多个雇员(因此我们可以在商店级别查询),因此where子句中的“IN”条件

以下是我目前掌握的情况:

select question.question_id as questionId, 
       ((sum(answer.answer) / count(answer.answer)) * 100) as avgScore
  from SPMADMIN.SPM_QC_ASSESSMENT_ANSWER answer
  join SPMADMIN.SPM_QC_QUESTION question 
    on answer.question_id = question.question_id
  join SPMADMIN.SPM_QC_ASSESSMENT assessment 
    on answer.assessment_id = assessment.assessment_id
  join SPMADMIN.SPM_QC_SUB_GROUP_TYPE sub_group 
    on question.sub_group_type_id = sub_group.sub_group_id
  join SPMADMIN.SPM_QC_GROUP_TYPE theGroup 
    on sub_group.group_id = theGroup.group_id
 where question.question_id in (select distinct question2.question_id 
                                  from SPMADMIN.SPM_QC_QUESTION question2
                               )
   and question.bool_yn_active_flag = 'Y'
   and assessment.agent_id in (?)
   and answer.answer is not null
order by theGroup.page_order asc, 
         sub_group.group_order asc, 
         question.sub_group_order asc
基本上,我希望看到:

|questionId|avgScore|
|     1    |   100  |
|     2    |   50   |
|     3    |   75   |
这样,员工回答的每一个问题都会出现在问题索引列表中,以及他们在所有回答时间内的平均得分

当我按原样运行它时,会出现“ORA-00937:非单个组函数”错误。我添加的“groupby”子句的任何组合都毫无帮助

当我运行它时,将
question.question\u id作为select的questionId,
部分删除,它运行良好,但它显示了所有问题的平均分数。我需要一个问题把它分解


任何帮助或指点都将不胜感激。

这不是您的加入,而是您对
分组方式的使用

在SQL中使用
groupby
时,定义组的是
groupby
SELECT
中的所有其他内容都必须是在整个组中运行的集合


您也可以在整个集合上进行聚合,而无需使用
分组依据
,但是每个列都需要位于聚合函数中。

这不是您的联接,而是您使用的
分组依据

在SQL中使用
groupby
时,定义组的是
groupby
SELECT
中的所有其他内容都必须是在整个组中运行的集合


您也可以在不使用GROUP BY的情况下对整个集合进行聚合,但是每个列都需要位于聚合函数中。

当您在SELECT列表中具有聚合函数(SUM和COUNT是聚合函数)时,SELECT列表中的任何其他列都需要位于GROUP BY子句中。例如:

SELECT fi, COUNT(fo)
  FROM fum
 GROUP BY fi
COUNT(fo)
表达式是聚合,而
fi
列是非聚合。如果要将另一个非聚合添加到选择列表,则还需要将其包含在GROUP BY中。比如说

SELECT TRUNC(fee), fi, COUNT(fo)
  FROM fum
 GROUP BY TRUNC(fee), fi

更准确地说,我们不应该说“选择列表中的列”,而是应该说“选择列表中的所有非聚合表达式”需要包含在GROUP BY子句中。

当选择列表中有聚合函数时(SUM和COUNT是聚合函数),然后,SELECT列表中的任何其他列都需要位于GROUPBY子句中。例如:

SELECT fi, COUNT(fo)
  FROM fum
 GROUP BY fi
COUNT(fo)
表达式是聚合,而
fi
列是非聚合。如果要将另一个非聚合添加到选择列表,则还需要将其包含在GROUP BY中。比如说

SELECT TRUNC(fee), fi, COUNT(fo)
  FROM fum
 GROUP BY TRUNC(fee), fi

更准确地说,我们应该说“选择列表中的所有非聚合表达式”,而不是说“选择列表中的列”将需要包含在GROUP BY子句中。

您是否尝试了
按问题分组。问题id按问题排序。问题id
?解决方案是Lamak建议的:
按问题分组。问题id
(在ORDER BY子句之前)。在您展示的示例中,除非您试图影响优化器计划,否则按选择列表中未包含的任何表达式排序没有意义。您是否尝试过按问题分组。问题id按问题排序。问题id
?解决方案是Lamak建议的:
按问题分组。问题id
(在ORDER BY子句之前)。在您展示的示例中,除非您试图影响优化器计划,否则按任何不在SELECT列表中的表达式进行排序是没有意义的。