2012-05-16 2 views
0

"agent_id"가 주어지면 에이전트가 평가 중에 응답 한 질문 목록을 제공하는 (Oracle) SQL 쿼리를 작성하려고합니다. 상담원이 그 질문에 대답 한 모든 시간에 평균 점수.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 : 단일 그룹 그룹 기능이 아닙니다"오류가 발생합니다. 내가 추가 한 "그룹화 기준"절의 조합은 최소한 도움이되지 않았습니다.

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

답변

1

조인이 아니라 GROUP BY을 사용합니다.

SQL에서 GROUP BY을 사용하면 GROUP BY이 그룹을 정의하는 것입니다. SELECT에있는 모든 항목은 그룹에서 작동하는 집계가되어야합니다.

GROUP BY없이 전체 집합에 대해 집계를 수행 할 수도 있지만 모든 열은 집계 함수 내에 있어야합니다.

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 목록에서 열을"말을하려면 BY 절.