根据单独的查询获取每行的平均值

时间:2016-08-30 21:44:58

标签: mysql sql average

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

4 个答案:

答案 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 :(得分: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;

答案 2 :(得分: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;

答案 3 :(得分:0)

补充@Matt的优秀答案/解决方案,您可以获得发布商名称发布商位置 Nbr of books 总计只需一次拍摄即可轻松获得图书费用平均每本图书价格

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
;

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