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

问题描述:

我试图编写一个(Oracle)SQL查询,给定一个“agent_id”,会给我一个代理在评估过程中回答的问题列表,以及代理人回答这些问题的所有时间的平均分数。SQL查询(不正确使用连接?)

注意:我试图设计查询,以便它支持多个员工(因此我们可以在商店级查询),因此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,部分的选择,它运行良好,但它显示了他们的平均分超过所有问题。我需要按问题细分。

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

+2

您是否试过'GROUP BY question.question_id ORDER BY question.question_id'? – Lamak

+0

Lamak提出的解决方案是:GROUP BY question.question_id'(在ORDER BY子句之前)。在你展示的例子中,除非你试图影响优化程序计划,否则任何不在SELECT列表中的表达式都是没有意义的。 – spencer7593

这不是你的加入,而是你使用GROUP BY

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

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

在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子句。