2017-04-18 1 views
0

読者の年齢が平均年齢を下回るすべての本を表示する必要があります。 スキーマは、これらのテーブルで構成されています:SQLでWITH句を使用すると、1つの値に対して複数の平均値が得られます

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

どのように多くのレコードを使用すると、年齢、Book.ISBNとして 'SELECT年齢(生年月日)から抜け出すか、名前 リーダー FROM Book.ISBN = Exemplar.ISBN'に関する書籍を登録しようReader.Number = Exemplar.Readerに模範を登録しよう私はそれが10だと思っています。私の推測では、「読者」ごとに複数の「Examplar」、または「Exemplar」ごとに複数の「Book」があることです。 – JNevill

+0

私はこれがうまくいかないと信じています - 第2の表では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 

整数にMeanAgeをキャストします。この

SELECT floor(AVG(Age)) as MeanAge 

へ平均年齢が15.5歳の場合、15歳の人が結果から除外されることを確実にします。

+0

私は実際には、条件を満たすすべての本の横に年齢平均を含める必要があります。 – Kristupas

関連する問題