2012-05-31 70 views
0

上述一般的學生,我創建了一個包含一個觀點:充分利用數據庫

student_full_name subject_code result 
Jennifer Higgins  CS1234   81 
Jennifer Higgins  CS1235   90 
Kal Penn    CS1234   70 
Kal Penn    CS1235   60 
Han Solo    CS1234   45 
Han Solo    CS1235   70 

我想獲得:

  1. 每個學生的平均成績這麼喜歡說詹妮弗·希金斯就讀在CS1234和CS1235中。她的平均分是85.50。

  2. 然後Jennifer Higgins標記將與所有入學的平均分數相比較 因此,所有受試者的AVG(結果)總計。

  3. 查詢會列出所有獲得高於平均分數的學生。

我知道我必須在這裏使用子查詢才能獲得所有結果的AVG。 這是一個僞代碼。我很困難,因爲我不確定如何使子查詢與查詢的結果進行比較。 我很確定我需要兩組語句來分組student_full_name,另一組來獲得所有的平均結果。

SELECT student_full_name, 
     AVG(results) AS average_result 
FROM viewEnrol 
WHERE average_result > (SELECT (AVG(results)) 
          FROM viewEnrol 

GROUP BY student_full_name 

//編輯

輸出應該的樣子。 Kal Penn和Han Solo沒有列出,因爲他們沒有超過平均分。 所有科目的平均分數爲69.33。韓·梭羅得到了57.5分,而卡爾·佩恩得到了65分。

student_full_name subject_code result 
Jennifer Higgins  CS1234   85.5 

任何幫助?

+1

什麼數據庫系統,哪個版本? ** SQL **只是*結構化查詢語言* - 許多數據庫系統使用的語言,但「SQL」不是數據庫產品......像這樣的東西可能是特定於供應商的 - 所以我們真的需要知道什麼你正在使用的數據庫系統.... –

+0

使用微軟數據庫管理工作室,所以我想它的t-sql – nfnmy

+0

你能提供輸出應該如何看起來像 –

回答

3

這應該做的工作。第一個內部查詢會給你所有學生的平均結果。 而第二會給平表的平均值。 PS:你不應該採取平均的平均值而不是平均所有結果的平均值。

+0

這一個工程就像一個魅力!謝謝! – nfnmy

2

如果你想對結果進行過濾聚集(如avg),你需要使用having而非where

一般規律是:

  • where過濾器是什麼原料(非聚集)行從實際的數據庫之前得到聚集發生;和
  • having過濾哪些(可能聚合的)行最終傳遞給您。

喜歡的東西(雖然未經測試):

SELECT student_full_name, 
     AVG (results) AS average_result 
FROM  viewEnrol 
GROUP BY student_full_name 
HAVING AVG (results) > (SELECT AVG (results) FROM viewEnrol) 
+0

不應該'AVG(結果)>'而不是'average_result> 0' ? – Pateman

+0

@Pateman:沒有。這會給你一個非零平均值的人。你只想要平均水平高於整體平均水平的學生。 – paxdiablo

+0

對,我的壞.. – Pateman

0

獲得平均結果應該只是一個過濾問題,所以在計算全局平均值時,您不需要引用外部查詢。你的僞代碼非常接近你所需要的。您可能想要將where子句轉換爲having子句。你也似乎是在比較高於普通學生的學生之後 - 而不是在淨平均水平以上的學生。確保你完全清楚平均值的定義是什麼。

這東西形式:

select student_full_name, avg(results) as avg_result 
from viewEnrol 
group by student_full_name 
having avg(results) > (
    select avg(avg_results) 
    from (
     select name, avg(results) as avg_results 
     group by student_full_name 
     ) 
    ) 
0

每個問題的解決方案,我創建了一個表

CREATE TABLE STUD 
(SNAME varchar(20), 
SCODE NUMBER PRIMARY KEY, 
MARKS NUMBER(4,2)) 

插入的值

SNAME SCODE MARKS 
-------------------- 
SAM  1001 90 
VAS  1001 80 
SAM  1002 60 
ANAND 1001 80 
VAS  1002 70 
ANAND 1002 50 

查詢

SELECT SNAME,AVG(MARKS) FROM STUD GROUP BY SNAME HAVING AVG(MARKS)>= 
(SELECT MAX(MARKS) FROM STUD WHERE SNAME='VAS')