2017-04-18 36 views
0

我需要显示读者年龄低于平均年龄的每本书。 架构由以下表:在SQL中使用WITH子句时,我得到一个以上的平均值

AUTHOR: ISBN, Name, Lastname; 
BOOK: ISBN, Name, Publisher, Pages, Value, Year; 
EXEMPLAR: Number, Taken (date), Returned (date), ISBN, Reader (reader's number), READER: Number (also reader's number, just named differently), ID number, Name, Lastname, Birthdate, Address. 

我写了下面的代码:

WITH Name_and_age (Age, Name, ISBN) as (SELECT age(birthdate) as Age, Book.ISBN, Name 
FROM Reader 
JOIN Exemplar on Reader.Number=Exemplar.Reader JOIN Book ON Book.ISBN=Exemplar.ISBN), 

MeanAge (Average) 
as (SELECT AVG(Age) as MeanAge FROM Name_and_age) 

SELECT Age, MeanAge, Name, ISBN FROM Name_and_age, MeanAge 
WHERE Age < MeanAge 

但对于一些书,结果显示:2或3点不同年龄的平均值。唯一书籍的总数是7,但结果给了我10行。有任何想法吗?先谢谢你!

+0

SELECT age(birthdate)作为年龄,Book.ISBN,名称 FROM Reader JOIN Exemplar on Reader.Number = Exemplar.Reader JOIN Book ON Book.ISBN = Exemplar.ISBN'我怀疑它是10.我的猜测是,根据'Reader',或者每个'Exemplar',你有多于一个'Examplar'或者多于一个'Book'。 – JNevill

+0

我不相信这是有效的 - 在第二个表格中,您定义了MeanAge列平均值。但是在最后一个查询中,您搜索名为MeanAge的列。也许最后一行应该是WHERE Age Hogan

+0

@JNevill你是对的,有7本独特的书,8个阅读器,但是结果表由10行组成。 – Kristupas

回答

0

你说,I need to show every book whose reader's age is below the mean age

代码包括这样的:

SELECT Age, MeanAge, Name, ISBN 

你没有说你想要的年龄。如果是这种情况,请不要选择它。另外,使用单词distinct来考虑多个人阅读的书籍。换句话说,更改上面的代码如下:

SELECT distinct MeanAge, Name, ISBN 

你也可能要改变这一点:

SELECT AVG(Age) as MeanAge 

这个

SELECT floor(AVG(Age)) as MeanAge 

这将铸就MeanAge整数并确保如果平均年龄为15.5岁,则15岁的人将被排除在结果之外。

+0

实际上,我必须在满足条件的每本书旁边添加年龄平均值。 – Kristupas