0

我正在尝试编写一个(Oracle)SQL 查询,给定一个“agent_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:不是单组功能”错误。我添加的“group by”子句的任何组合都没有任何帮助。

当我运行它删除question.question_id as questionId,选择的部分时,它运行良好,但它显示了他们在所有问题上的平均分数。我需要按问题分解。

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

4

2 回答 2

2

如果 SELECT 列表中有聚合函数(SUM 和 COUNT 是聚合函数),那么 SELECT 列表中的任何其他列都需要在 GROUP BY 子句中。例如:

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

COUNT(fo)表达式是聚合,列fi是非聚合。如果要将另一个非聚合添加到 SELECT 列表,它也需要包含在 GROUP BY 中。例如

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

更准确地说,与其说“SELECT 列表中的列”,不如说“SELECT 列表中的所有非聚合表达式”都需要包含在 GROUP BY 子句中。

于 2012-05-16T21:34:28.373 回答
1

这不是您的加入,而是您对GROUP BY.

当您GROUP BY在 SQL 中使用 a 时,您GROUP BY就是定义组的事物。您拥有的所有其他东西都必须在SELECT对组进行操作的聚合中。

您也可以在没有 的情况下对整个集合进行聚合GROUP BY,但是每一列都需要在聚合函数中。

于 2012-05-16T21:13:45.283 回答