我正在尝试编写一个(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,
部分时,它运行正常,但它显示了所有问题的平均分数。我需要将其分解为问题。
非常感谢任何帮助或指示。
答案 0 :(得分: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子句中。
答案 1 :(得分:1)
这不是你的加入,而是你使用GROUP BY
。
在SQL中使用GROUP BY
时,您GROUP BY
的内容就是定义组的内容。您SELECT
中的其他所有内容都必须是在群组中运行的聚合。
您也可以在没有GROUP BY
的情况下对整个集合进行聚合,但是每个列都需要在聚合函数中。