2012-11-29 91 views
0

我必须创建一个显示父亲及其平均孩子数量的sql语句。SQL:每个父亲的平均孩子

这是我的SQL脚本:

create table breeder (
breederNumber number(3) primary key, 
name   varchar2(20), 
residence  varchar2(20), 
password  varchar2(20) 
); 

create table race (
raceCode  varchar2(2) primary key, 
raceName  varchar2(20) not null 
); 

create table sheep (
earTagNumber number(2) primary key, 
father   number(2), 
mother   number(2), 
raceCode  varchar2(2), 
name   varchar2(20), 
previousBreeder number(3), 
genotype  varchar2(7), 
gender   varchar2(1) check (gender = 'M' OR gender = 'F'), 

constraint fk_previousBreeder foreign key (previousBreeder) references breeder(breederNummer) on delete cascade, 
constraint rk_raceCode foreign key (raceCode) references race(raceCode) on delete cascade, 
constraint fk_mother foreign key (mother) references sheep(earTagNumber) on delete cascade, 
constraint fk_father foreign key (father) references sheep(earTagNumber) on delete cascade 
); 

这是我到目前为止有:

select (s1.father), avg(s2.earTagNumber) as averageNumberOfKids 
from sheep s1 
join sheep s2 on s1.earTagNumber= s2.father 
group by s1.father; 

输出我得到了什么:

FATHER AVERAGENUMBEROFKIDS 
------ ------------------- 
         6.75 

谁能帮助我?

一些测试数据:提前http://pastie.org/5452411

谢谢!

+2

您是否尝试过创建SQL查询?如果是这样,请显示您所写的查询,以便我们看到您遇到问题的位置。你不应该只是问人们的代码... –

+0

告诉我们你已经做了什么。提示开始:你的例子中甚至没有'select'。另外,检查你的教科书是否有“聚合函数” – Crisfole

+0

我在第一篇文章中添加了它 –

回答

0

这里的每父亲的孩子总数:

Select 
    fathers.EarTagNumber, 
    fathers.Name, 
    Count(*) As NumberOfKids 
From 
    sheep fathers 
    Inner Join 
    sheep children 
    On fathers.earTagNumber = children.father 
Group By 
    fathers.EarTagNumber, 
    fathers.Name; 

这里(总孩子/父亲的数量)的孩子的平均数量

Select 
    Avg(NumberOfKids) As AvgKids 
From (
    Select 
    fathers.EarTagNumber, 
    Count(*) As NumberOfKids 
    From 
    sheep fathers 
     Inner Join 
    sheep children 
     On fathers.earTagNumber = children.father 
    Group By 
    fathers.EarTagNumber 
) a; 

http://sqlfiddle.com/#!4/e5121/10