2016-08-30 20 views
-1

Table schema個別のクエリに基づいて各行の平均を取得する

上記は私のテーブルスキーマです。私の仕事はです。パブリッシャーごとに、パブリッシャーの名前、パブリッシャーのロケーション、パブリッシャーが販売している書籍の平均コストを表示するSQLコマンドを書いてください。は、私はほとんど働いてクエリを持っています。

SELECT Publisher.name, Publisher.location, 
(SELECT AVG(Book.cost) 
FROM (Book 
INNER JOIN Publisher 
ON Book.publisherName = Publisher.name) 
WHERE Book.publisherName = Publisher.name 
) bookAverage FROM Book 
INNER JOIN Publisher ON Book.publisherName = Publisher.name; 

問題は、これがBooks表にすべての書籍の平均値を返すことです。各パブリッシャーに関連付けられた書籍の平均費用のみを返すように変更するにはどうすればよいですか?

ここではすでに実装スキーマとフィドルです:

http://sqlfiddle.com/#!9/7a9909/11/0

答えて

3
SELECT p.name, p.location, AVG(b.Cost) as AverageBookCost 
FROM 
    Publisher p 
    INNER JOIN book b 
    ON b.publisherName = p.name 
GROUP BY 
    p.name, p.location 

http://sqlfiddle.com/#!9/7a9909/18

のみ1参加、ノーサブクエリ、内側の選択のあなたがまっすぐ進む探しているとして必要な何もテーブル間の結合の集計GROUP BY句を正しく指定するだけです。

1

あなたは近くです。 JOINが多すぎます。たとえば、サブクエリは相関句を必要とします:

SELECT p.name, p.location, 
     (SELECT AVG(b.cost) 
     FROM Book b 
     WHERE b.publisherName = p.name 
     ) as bookAverage 
FROM Publisher p; 

あなたはJOINとしてこれを書くとしたら、あなたが適切LEFT JOINGROUP BYを使用して、それを記述します。

SELECT p.name, p.location, AVG(b.cost) as bookAverage 
FROM Publisher p JOIN 
    Book b 
    ON b.publisherName = p.name 
GROUP BY p.name, p.location; 
0
補完
SELECT Publisher.name, Publisher.location, costs.avg_cost 
FROM Publisher 
INNER JOIN (
    SELECT AVG(Book.cost) as avg_cost, Book.publisherName 
    FROM Book 
    GROUP BY Book.publisherName 
) AS costs ON costs.publisherName = Publisher.name; 
+1

この回答は低品質レビューキューに表示されています。これはおそらくコードの説明を提供していないからです。このコードが質問に答える場合は、答えにコードを説明するテキストを追加することを検討してください。この方法では、より多くのアップボックスを取得し、質問者が新しい何かを学ぶのを助けます。 – lmo

+0

@Imo問題の著者は解決策にとても近いと思ったので、詳細な説明は必要ありません。 –

0

@Mattからの素晴らしい答え/解決策を得ることができます出版社名出版社の場所のNBR、1回のショットで簡単に予約するあたりブックスと平均価格の総費用:

SELECT b.publisherName, p.location, COUNT(1) AS total_books, 
ROUND(SUM(cost), 2) AS books_total_cost, ROUND(AVG(cost), 2) AS avg_cost_per_book 
FROM book b 
JOIN publisher p ON p.name = b.publisherName 
WHERE 1=1 
GROUP BY b.publisherName 
ORDER BY b.publisherName 
; 

私は何か質問がある場合は、クエリ自体がうまく自己説明が、だと思い私のゲストになってください:

関連する問題