Использование SQL-запроса для поиска информации о клиентах, которые заказали> х типов товаров - PullRequest
3 голосов
/ 06 сентября 2011

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

Предположим, что есть база данных со следующими таблицами:

  1. customer_table с customer_ID (ключевое поле), customer_name
  2. orders_table с order_ID (ключевое поле), customer_ID, product_ID

Теперь предположим, что я хотел бы найти имена всех клиентов, которые заказали более 10 различных типов продуктов, и количество типов продуктов, которые они заказали. Несколько заказов на один и тот же товар не учитываются.

Я думаю, что приведенный ниже запрос должен работать, но есть следующие вопросы:

  1. Можно ли вообще использовать count (отличный от xxx) с оператором group by?
  2. Является ли метод, который я использую стандартным способом? У кого-нибудь есть идеи получше (например, без использования временных таблиц)?

Ниже мой запрос

select T1.customer_name, T1.customer_ID, T2.number_of_products_ordered
from customer_table T1
inner join 
(
    select cust.customer_ID as customer_identity, count(distinct ord.product_ID) as number_of_products_ordered
    from customer_table cust
    inner join order_table ord on cust.customer_ID=ord.customer_ID
    group by ord.customer_ID, ord.product_ID
    having count(distinct ord.product_ID) > 10
) T2
on T1.customer_ID=T2.customer_identity
order by T2.number_of_products_ordered, T1.customer_name

Ответы [ 2 ]

5 голосов
/ 06 сентября 2011

Разве это не то, что вы ищете?Кажется, немного проще.Протестировано на SQL Server - работает нормально.

SELECT customer_name, COUNT(DISTINCT product_ID) as products_count FROM customer_table
INNER JOIN orders_table ON customer_table.customer_ID = orders_table.customer_ID
GROUP BY customer_table.customer_ID, customer_name
HAVING COUNT(DISTINCT product_ID) > 10
2 голосов
/ 06 сентября 2011

Вы можете сделать это проще:

select

    c.id,
    c.cname,
    count(distinct o.pid) as `uniques`

from o join c
on c.id = o.cid

group by c.id

having `uniques` > 10
...