Mike K Ng Ответов: 2

Как объединить оператор select * с оператором count?


У меня есть два стола :-

Product and Order_Details
    
    
         Product                     Order_Details
        -----------------         -----------------
        Product_ID (int)           Order_ID (int)
        Product_Name(varchar)      Product_Name(varchar)
        Product_Spec


выборочные данные :-

Order_Details
        -----------------
    OrderID	    Product_Name
    1	         Alpha
    2	         Alpha
    3	         Alpha
    4            Bravo
    5            Charlie


Product
    -----------------
    Product_ID	    Product_Name      Product_Spec 
        1	         Alpha              Good
        2	         Bravo              Excellent
        3	         Charlie            Mediocre



Я написал два SQL запроса :-

Запрос 1:
Select * from Product


Запрос 2:
select top 1 Product_Name, count(*) as cnt from [Order_Details] group by Product_Name order by count(*) desc INNER JOIN [Product] on (Order_Details.Product_Name = Product.Product_Name)


Возврат результатов первого запроса :-

Product_ID	    Product_Name      Product_Spec 
            1	         Alpha              Good
            2	         Bravo              Excellent
            3	         Charlie            Mediocre

Second Query Results return :-
        Product_Name	    cnt 
        ------------       -----
          Alpha              3




Желаемый результат :-

Product_ID      Product_Name      Product_Spec
     1             Alpha             Good


Что я уже пробовал:

Я пытаюсь отобразить все доступные значения (select *) в таблице [Product] на основе операции подсчета, которую я сделал для [Order_Details] и Query2. Есть идеи, как это сделать?

2 Ответов

Рейтинг:
16

OriginalGriff

Первое, что следует заметить, - это неправильный дизайн вашей базы данных: вы должны хранить не название продукта в таблице Order_Details, а идентификатор продукта в качестве внешнего ключа к таблице Products:
Продукты:

ID     INT
Name   NVARCHAR
Spec   NVARCHAR

Заказы:
ID     INT
PID    INT, Foreign key
И вам, вероятно, нужна дополнительная информация в таблице заказов: какая-то ссылка на клиента и на другие элементы заказа, дата и тому подобное.
Обычно у вас здесь есть три или четыре таблицы: продукты, клиенты, заказы, заказы, и они будут связаны:
OrderDetails имеет внешние ключи к продуктам и заказам.
Заказы имеют внешний ключ для клиентов.

Тогда вы собирали бы свою информацию как
SELECT PID, COUNT(PID) AS OrderCount FROM OrderDetails GROUP BY PID

Который вернется
1    1
2    1
3    1
Для ваших данных.
Затем вы используете соединение с ним, чтобы получить нужную вам информацию:
SELECT TOP 1 p.ID, p.Name, p.Spec FROM Products p
JOIN (SELECT PID, COUNT(PID) AS OrderCount FROM OrderDetails GROUP BY PID) od
   ON p.ID = od.PID
ORDER BY od.OrderCount DESC


Рейтинг:
1

Andrew Ussher

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

Из моего готового вопроса Вы пытаетесь сделать следующее (псевдокод)

Select * From Product where Product = (most common sold item in Order_Details)

Мой предлагаемый подход приведен ниже

SELECT * FROM Product
WHERE Product in (Select Product FROM 
    (SELECT TOP 1 Product, Count(Product) 
     FROM Order_Details 
     GROUP by Product 
     ORDER by Count(Product) desc))


Это может быть не самый элегантный способ сделать что-то, но иногда, когда требуется одноразовый запрос, полезно иметь возможность получить быстрый ответ, как показано выше.

Счастливого кодирования.