2010-04-29 5 views
2

У меня есть три таблицы, клиенты, продажи и продукты.SQL Complex Select - запрос формирования запроса

Продажи связывают CustomerID с ProductID и имеют SalesPrice.

select Products.Category, AVG(SalePrice) from Sales 
inner join Products on Products.ProductID = Sales.ProductID 
group by Products.Category 

Это позволяет мне видеть среднюю цену для всех продаж по категориям. Тем не менее, я хочу включить только клиентов, которые имеют более 3 записей продаж или больше в БД.

Я не уверен, что это лучший способ или любой другой способ. Идеи?

+0

, что DB двигатель и версия, пожалуйста? – gbn

ответ

4

Вы не упомянули данные клиента в любом месте, так что я буду считать, что это в таблице продаж

Вам нужно фильтровать и ограничить таблицу Sales первым для клиентов с более 3-х продаж, а затем присоединиться, чтобы получить категорию продукта и получить в среднем по категориям

select 
    Products.Category, AVG(SalePrice) 
from 
    (SELECT ProductID, SalePrice FROM Sales GROUP BY CustomerID HAVING COUNT(*) > 3) S 
    inner join 
    Products on Products.ProductID = S.ProductID 
group by 
    Products.Category 
0

Я бы попробовал следующее:

select Products.Category, AVG(SalePrice) from Sales s 
inner join Products on Products.ProductID = s.ProductID 
where 
(Select Count(*) From Sales Where CustomerID = s.CustomerID) > 3 
group by Products.Category 
0

Я бы создать псевдо-таблицу «больших идентификаторы клиентов» с выбором, а затем присоединить его к вашему запросу, чтобы ограничить результаты:

SELECT Products.Category, AVG(SalePrice) FROM Sales 
    INNER JOIN Products ON Products.ProductID = Sales.ProductID 
    INNER JOIN (
    SELECT CustomerID FROM Sales WHERE COUNT(CustomerID) >= 3 GROUP BY CustomerID 
) BigCustomer ON Sales.CustomerID = BigCustomer.CustomerID 
    GROUP BY Products.Category 

лень, чтобы проверить это, хотя, так что дайте мне знать, если он работает; о)

0

Другой способ

;WITH FilteredSales AS 
(
SELECT Products.Category, Sales.SalesPrice, COUNT(Sales.CustomerId) OVER(PARTITION BY Sales.CustomerId) AS SaleCount 
FROM Sales 
INNER JOIN Products ON Products.ProductID = Sales.ProductID 
) 
select Category, AVG(SalePrice) 
from FilteredSales 
WHERE SaleCount > 3 
group by Category