2011-04-12 73 views
0

我試圖完成這個Oracle SQL查詢,但沒有運氣。Oracle SQL查詢問題

「列出具有最小平均成本的部門(提示:SELECT MIN(AVG(cost))。是隻要沒有其他列在SELECT語句組合有效,您可以用另一個查詢上述合併爲一個子查詢)。」

我可以用它的平均成本顯示部門,但是當我嘗試在MIN中工作時,它會中斷。這是我迄今爲止所擁有的。

SELECT DeptNo, AVG(projcost) FROM projects, clinicians WHERE clinicians.Clinicianno = projects.Clinicianno GROUP BY DeptNo; 

這會給我科指南和他們的AVG,但是當我改變AVG(projcost)MIN(AVG(projcost)它打破。暗示是使它成爲一個子查詢,但我不知道如何做到這一點呢。任何幫助將非常感激。

+0

它是如何突破? – Bernard 2011-04-12 15:58:53

+0

子查詢是查詢中的查詢。我不會給你答案,但是這裏有一個描述子查詢的鏈接:[在網上Tech上的Oracle子查詢] [1]。我想你會從這份任務中學到更多東西,學習如何獨立完成任務,而不是去捕捉別人的答案。 [1]:http://www.techonthenet.com/oracle/subqueries.php – scrappedcola 2011-04-12 16:00:32

+0

@Bernard錯誤:此處不允許使用組功能。 – LunarZer0 2011-04-12 16:10:08

回答

3
SELECT 
    MIN(q1.AvgProjCost) 
FROM (SELECT 
     DeptNo, 
     AVG(projcost) as AvgProjCost 
     FROM projects, clinicians 
     WHERE clinicians.Clinicianno = projects.Clinicianno 
     GROUP BY DeptNo) q1 

EDITED 假設我有以下的部門項目成本

Department ProjectCost 
1   15 
1   15 
1   15 
2   16 
2   16 
3   17 
3   17 
4   18 

這些項目的成本將呈現以下平均

Department Average 
1   15 
2   16 
3   17 
4   18 

每個部門的最低平均仍是相同的結果集。

EDITED AGAIN

如果你真的必須有最小平均每個部門,那麼這將工作

SELECT 
    q1.Dept, 
    MIN(q1.AvgProjCost) 
FROM (SELECT 
     DeptNo, 
     AVG(projcost) as AvgProjCost 
     FROM projects, clinicians 
     WHERE clinicians.Clinicianno = projects.Clinicianno 
     GROUP BY DeptNo) q1 
GROUP BY q1.Dept 

不過你很快就會意識到,這個結果集是而且將永遠是相同的

 SELECT 
     DeptNo, 
     AVG(projcost) as AvgProjCost 
     FROM projects, clinicians 
     WHERE clinicians.Clinicianno = projects.Clinicianno 
     GROUP BY DeptNo 

EDITED一旦更多

爲了獲得具有最小平均項目部成本

SELECT 
    q1.Dept, 
    q1.AvgProjCost 
FROM (SELECT 
     DeptNo, 
     AVG(projcost) as AvgProjCost 
     FROM projects, clinicians 
     WHERE clinicians.Clinicianno = projects.Clinicianno 
     GROUP BY DeptNo) q1 
WHERE rownum = 1 
ORDER BY AvgProjCost DESC 
+0

這是迄今爲止最接近的,除了輸出僅顯示最低的MIN(AVG())並且不顯示DeptNo。 – LunarZer0 2011-04-12 16:07:47

+0

@ LunarZer0好吧,如果按DeptNo的平均(項目成本)分組,則每個部門將得到1行。如果您獲得剛剛查詢的平均值的最小值,按部門分組,您將得到相同的結果。在我的回答中查看我的編輯 – 2011-04-12 16:10:04

+0

您的解決方案確實可以幫助我達到部門最低的平均水平,但問題很簡單,他們希望輸出結果顯示爲「DeptNo,Min(AVG(projcost))」,並且它只是給出我「MIN(AVG(projcost))」我試圖在DeptNo輸出中工作。 – LunarZer0 2011-04-12 16:15:10

1

試試這個:

WITH avgData AS 
SELECT a.*, 
      RANK() OVER(ORDER BY avg_cost) RN 
    FROM 
    (
     SELECT DeptNo, 
        AVG(projcost) avg_cost, 
        projects.ROWNUM rn 
     FROM projects, 
        clinicians 
     WHERE clinicians.Clinicianno = projects.Clinicianno 
     GROUP BY DeptNo 
    ) a 
SELECT * 
    FROM avgData 
WHERE RN = 1 
-1

SELECT TOP 1 DEPTNO ,AVG(projcost) FROM 項目 ,醫生 WHERE 臨牀醫生.Clinicianno = projects.Clinicianno GROUP BY DeptNo ORDER BY AVG(projcost);

-1

試試....

樣本數據

DEPTNO| AVG_COST 100 |8601.333333 30 |4150 90 |19333.33333 20 |9500 70 |10000 110 |10154 50 |3475.555556 80 |8955.882353 40 |6500 60 |5760 10 |4400

SELECT DEPTNO,AVG_COST FROM (SELECT P.DEPTNO, (AVG(C.COST)) AVG_COST FROM PROJECTS P, CLINICIANS C WHERE P.DEPTNO=C.DEPTNO GROUP BY P.DEPTNO ) WHERE AVG_COST= (SELECT MIN(AVG_COST) FROM (SELECT P.DEPTNO, (AVG(C.COST)) AVG_COST FROM PROJECTS P, CLINICIANS C WHERE P.DEPTNO=C.DEPTNO GROUP BY P.DEPTNO ) );

上面的語句將下面給你結果

DEPTNO| AVG_COST 50 |3475.555556