2016-02-28 54 views
1

我想列出所有年齡大於具有相同國籍的人的平均年齡的人。涉及三個表格:人員,護照和國家。這是我到目前爲止有:oracle sql:比具有相同國籍的人的平均年齡早的人

select round(months_between(sysdate, dob)/12) as age, country.name, person.name, person.surname 
from person 
join passport on person.pid= passport.pid 
join country on passport.cid= country.cid 
where round(months_between(sysdate, dob)/12) > 
(select avg(round(months_between(sysdate, dob)/12)) 
from person join passport on person.pid= passport.pid 
join country on passport.cid= country.cid); 

出於某種原因,我得到它小於人的平均年齡不想要的結果。對於同一國籍的人的平均年齡的select語句是:

SELECT avg(round(months_between(sysdate, dateofbirth)/12)) as age, country.name 
from person 
join passport on person.personid = passport.personid 
join country on passport.countryid = country.countryid 
group by country.name; 

我用這個沒有GROUP BY子句我再選擇在上述範圍內。這可以正常工作,但只有年齡大於平均年齡的人才能正確地查詢結果。

+0

提示;子查詢中有太多連接。它應該與外部查詢相關聯。 –

+0

我從_subselect_中刪除了所有連接,但仍然在輸出中顯示不需要的結果。 @GordonLinoff –

回答

2

這是一個很好的用例的解析函數:

SELECT * 
    FROM (select round(months_between(sysdate, dob)/12) as age,    
       country.name country_name, 
       person.name person_first_name, 
       person.surname person_last_name, 
       avg(round(months_between(sysdate, dob)/12)) 
        over (partition by country.name) avg_for_country 
      from person 
       join passport on person.pid = passport.pid 
       join country on passport.cid = country.cid 
     ) 
WHERE age > avg_for_country 
+0

感謝您的回答,但出現錯誤:執行此代碼時未找到ORA-00923:FROM關鍵字[SQL State = 42000,DB Errorcode = 923]。 @Matthew McPeak –

+0

它似乎只是一個錯字:'(country.name)' - >'OVER(PARTITION BY country.name)分區' – Aleksej

+0

已更新爲正確的錯字。謝謝。 –