以上是我的表架构。我的任务是编写一个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
表中所有图书的平均值。如何将此更改为仅返回与每个发布商相关联的图书的平均费用?
这是已经实现的架构的小提琴:
答案 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 JOIN
和GROUP 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
;
我认为查询本身是不言自明的,但如果您有任何问题,请成为我的客人:)