如何选择具有一定数量订单和其他条件的客户?

时间:2016-06-06 19:12:32

标签: sql postgresql group-by

我在学习SQL。有一个特定的查询我觉得很难实现(使用PostgreSQL数据库)。

有人可以帮助我吗?

查询:"至少有一个订单包含至少3个产品类别的产品的客户是谁?"。

结果应包含2列:customerIDQuantity of orders

表格如下:

  1. 产品 ProductID (id of a product) | ProductCategoryID (product categories)两个整数。
  2. SalesOrderDetail SalesOrderID (id order) | SalesOrderDetailID | OrderQty | ProductID,所有这些都是整数。
  3. SalesOrderHeader SalesOrderID | CustomerID,两个整数。
  4. 到目前为止,我唯一得到的是声明的第一部分:

    select salesorderheader.customerID, salesorderdetail.orderqty 
    from salesorderheader, salesorderdetail;
    

    示例数据:

     productid | productcategoryid  
    -----------+-------------------  
             1 |                 2                  
             2 |                 2                 
             3 |                 3                  
             4 |          
    
    salesorderid  | salesorderdetailid | orderqty | productid   
    --------------+--------------------+----------+-----------  
            43659 |                  1 |        1 |       776  
            43659 |                  2 |        3 |       777  
            43659 |                  3 |        1 |       778
    
    
    salesorderid | customerid   
    
    --------------+------------  
            43659 |      29825  
            43660 |      29672  
            43661 |      29734
    

1 个答案:

答案 0 :(得分:1)

我在这里看到两种方法:

1)生成一个子查询,其中包含salesOrderID的计数和用于该销售订单的Distinct ProductCategories的数量。

SELECT customerID, count(Distinct OH.SalesOrderID) SalesOrdersWithMoreThan3Categories
FROM SalesOrderHeader OH
INNER JOIN (SELECT OD.SalesOrderID, Count(Distinct P.ProductCategoryID) Cnt
            FROM SalesOrderDetail OD 
            INNER JOIN Product P
              on P.ProudctID = OD.ProductID
            GROUP BY OD.SalesOrderID) B
   on OH.SalesOrderID = B.SaleOrderID
  and B.cnt >=3
GROUP BY  OH.customerID

2)使用存在来识别订单详细信息不同productCategories的数量> = 3

SELECT OH.customerID, count(Distinct OH.SalesOrderID) SalesOrdersWithMoreThan3Categories
FROM SalesOrderHeader OH
WHERE exists (SELECT 1
            FROM SalesOrderDetail OD 
            INNER JOIN Product P
              on P.ProudctID = OD.ProductID
            WHERE OH.SalesOrderID = OD.SalesOrderID
            GROUP BY OD.SalesOrderID
            HAVING Count(Distinct P.ProductCategoryID) >=3)
GROUP BY  OH.customerID