2013-11-18 3 views
3

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

Вот мой код.

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


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

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

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

+1

Основная работа 'group by * * с * соединением ничем не отличается от' group by' без объединения. Btw: какую СУБД вы используете? Postgres? Oracle? –

+0

Это SQL Server 2008. – user2891712

ответ

0

В принципе, для любой СУБД вам нужно 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; 

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

+0

Спасибо за ваш ответ :) Я пробовал это, и он работает - но что-то кажется выключенным. Возможно, это просто с образцовой базой данных, которую мы используем. Естественно, цена AVG Retail была бы выше, чем оптовая, чтобы получать прибыль, но результаты были очень странными и не имеющими смысла. Но это может быть просто база данных. – user2891712

+0

Не благодарите меня, если это помогло вам поблагодарить галочку. ;-) – PlantTheIdea

+0

Я буду, когда это позволит мне. Возможно, вы могли бы это понять, хотя, например, результаты показывают: цена AVG оптовой цены $ 28, с розничной торговлей AVG в 1800 долларов. Затем некоторые говорят, например, о оптовой цене AVG в размере 680 долларов США, а AVG Retail - 50 долларов США. Это не делает мне ничего, но код выглядит правильно? – user2891712

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