2016-08-30 5 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, 
     (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; 
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 книг, Общая стоимость книг и Avg цены за книгу легко в одном кадре:

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 
; 

Я думаю, что сам запрос хорошо понятен, но если у вас есть какие-либо вопросы , пожалуйста, будь моим гостем :)

Смежные вопросы