2016-08-30 47 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 s。例如,子查询只需要相关条款:

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

补全:

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写来自@Matt的最佳答案/解决方案您可以获得发行商名称发行商地点图书 NBR,在一个单杆书籍和每本书平均价格总成本很容易:

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 
; 

我想查询本身是非常不言自明,但如果您有任何问题 ,请作为我的客人:)