2012-05-16 78 views
0

我試圖編寫一個(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

回答

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列表中的所有非集合表達式」將需要包含在GROUP BY子句。