Использование агрегатных функций с внутренними соединениями

У меня возникла проблема с пониманием Group By при использовании агрегатных функций. Я прекрасно понимал это без использования внутренних объединений, но теперь я не понимаю, по чему группировать.

Вот мой код.

SELECT  ProductName,
        Products.ProductNumber,
        AVG(WholesalePrice),
        AVG(RetailPrice)


FROM    Products INNER JOIN ProductVendors
        ON Products.ProductNumber = ProductVendors.DaysToDeliver;

Как вы понимаете, я пытаюсь найти Средние цены и не знаю, по какому сгруппировать. Я пробовал группировать по всему там, и ничего не сработает. Какие-либо предложения?

Вот ошибка: столбец «Products.ProductName» недействителен в списке выбора, поскольку он не содержится ни в агрегатной функции, ни в предложении GROUP BY.


person user2891712    schedule 18.11.2013    source источник
comment
Основная работа group by с соединением ничем не отличается от group by без соединения. Кстати: какую СУБД вы используете? Постгрес? Оракул?   -  person a_horse_with_no_name    schedule 19.11.2013
comment
Это SQL Server 2008.   -  person user2891712    schedule 19.11.2013


Ответы (1)


По сути, для любой СУБД вам необходимо GROUP BY элементы, над которыми вы не выполняете агрегатные функции:

SELECT Products.ProductName AS ProductName
    ,Products.ProductNumber AS ProductNumber
    ,AVG(Products.WholesalePrice) AS AvgWholesalePrice
    ,AVG(Products.RetailPrice) AS AvgRetailPrice
FROM Products Products
INNER JOIN ProductVendors Vendors ON Products.ProductNumber = Vendors.DaysToDeliver    
GROUP BY Products.ProductName, Products.ProductNumber;

Кроме того, при выполнении JOINs вы действительно должны правильно использовать псевдонимы таблиц, а затем ссылаться на псевдонимы с их полями. Он более прозрачен, требует меньше неявного преобразования оптимизатором SQL и обеспечивает лучшее обслуживание.

person PlantTheIdea    schedule 18.11.2013
comment
Спасибо за ваш ответ :) Я попробовал это, и он работает, но что-то не так. Может быть, это просто с образцом базы данных, которую мы используем. Естественно, розничная цена AVG должна была быть выше, чем оптовая, чтобы получить прибыль, но результаты были очень странными и бессмысленными. Но это может быть просто база данных. - person user2891712; 19.11.2013
comment
Я тоже буду, когда это позволит. Возможно, вы могли бы понять это — результаты показывают, например, — оптовая цена AVG 28 долларов, а розничная цена AVG — 1800 долларов. Затем некоторые говорят, например, что оптовая цена AVG составляет 680 долларов США, а розничная цена AVG — 50 долларов США. Для меня это не имеет никакого смысла, но код выглядит правильно? - person user2891712; 19.11.2013
comment
не видя данных в таблицах, я не мог бы вам сказать, но это похоже на проблему целостности данных. я бы провел некоторое QA, чтобы исследовать товары, оптовая цена которых ниже, чем розничная, а затем посмотреть на точки данных, связанные с этими товарами. - person PlantTheIdea; 19.11.2013