SQL Complex Select - запрос на формирование проблемы - PullRequest
2 голосов
/ 29 апреля 2010

У меня есть три таблицы: клиенты, продажи и продукты.

Sales связывает CustomerID с ProductID и имеет SalesPrice.

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

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

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

Ответы [ 4 ]

4 голосов
/ 29 апреля 2010

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

Вам необходимо сначала отфильтровать и ограничить таблицу продаж для клиентов с более чем 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 голосов
/ 29 апреля 2010

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

;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
0 голосов
/ 29 апреля 2010

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

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

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

0 голосов
/ 29 апреля 2010

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

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...