简体   繁体   English

使用SQL查询查找订购> x类产品的客户的详细信息

[英]Using SQL query to find details of customers who ordered > x types of products

Please note that I have seen a similar query here , but think my query is different enough to merit a separate question. 请注意,我在这里看到过类似的查询,但认为我的查询不同,值得单独提问。

Suppose that there is a database with the following tables: 假设有一个包含以下表的数据库:

  1. customer_table with customer_ID (key field), customer_name customer_table with customer_ID(key field),customer_name
  2. orders_table with order_ID (key field), customer_ID, product_ID order_table with order_ID(key field),customer_ID,product_ID

Now suppose I would like to find the names of all the customers who have ordered more than 10 different types of product, and the number of types of products they ordered. 现在假设我想找到订购了10种以上不同类型产品的所有客户的名称,以及他们订购的产品类型的数量。 Multiple orders of the same product does not count. 同一产品的多个订单不计算在内。

I think the query below should work, but have the following questions: 我认为下面的查询应该有效,但有以下问题:

  1. Is the use of count(distinct xxx) generally allowed with a "group by" statement? 使用count(distinct xxx)通常是否允许使用“group by”语句?
  2. Is the method I use the standard way? 我使用标准方法的方法是什么? Does anybody have any better ideas (eg without involving temporary tables)? 有没有人有更好的想法(例如没有涉及临时表)?

Below is my query 以下是我的查询

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

Isn't that what you are looking for? 这不是你想要的吗? Seems to be a little bit simpler. 似乎有点简单。 Tested it on SQL Server - works fine. 在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

You could do it more simply: 你可以更简单地做到:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM