只有当一个项目存在于桌子上3或更多次postgres时才选择

时间:2016-06-11 15:40:33

标签: postgresql

我有2张桌子。 SalesOrderDetail和SalesOrderHeader。

SalesOrderDetails包含SalesOrderID和ProductID列。 SalesOrderHeader包含SalesOrderID和CustomerID。

我想创建一个查询,显示订购了3个或更多具有不同ProductID的产品的客户以及他订购了多少订单(包含3个或更多不同的产品)。我知道当SalesOrderDetail表的SalesOrderID号超过3次或更多次时,客户订购了3个或更多产品。

SalesOrderDetail Table

SalesOrderHeader Table

因此ID为29825的客户订购了12种不同的产品。

这是我的代码:

SELECT "SalesOrderHeader"."CustomerID", count("SalesOrderDetail"."SalesOrderID") AS TotalOrders
FROM
    public."SalesOrderHeader",
    public."SalesOrderDetail"
WHERE
    "SalesOrderHeader"."SalesOrderID" = "SalesOrderDetail"."SalesOrderID" 
GROUP BY "SalesOrderHeader"."CustomerID"
HAVING count("SalesOrderDetail"."SalesOrderID") >= 3

问题在于它显示了他订购的产品数量,但我希望总订单包含3种或更多不同的产品。

1 个答案:

答案 0 :(得分:0)

如果您希望每个客户拥有3个或更多产品的总订单,则使用两个级别的聚合:

select soh."CustomerID", count(*) as NumOrders
from public."SalesOrderHeader" soh join
     (select SalesOrderID, count(distinct ProductID) as numproducts
      from public."SalesOrderDetail" sod
      group by SalesOrderId
     ) sod
     on sod."SalesOrderID" = soh."SalesOrderID"
where numproducts >= 3
group by soh."CustomerID"