使用Group By从多个表中获取数据

时间:2013-05-20 08:16:52

标签: sql database postgresql join group-by

我在PostgreSql数据库中使用三个表:

Customer(Id, Name, City),
Product(Id, Name, Price),
Orders(Customer_Id, Product_Id, Date)

我想执行一个查询来获取“已经订购了至少两种与产品不同的产品的客户”。我写的查询是:

select c.*, p.*
from customer c
join orders o on o.customer_id = c.id
join product p on p.id = o.product_id
group by (c.id)
having count(distinct o.product_id)>=2

它抛出错误:

“column”p.id“必须出现在GROUP BY子句中或用于聚合函数 第1行:select c.*, p.*“。

但是,如果我从select语句中删除p。*(假设我不想要产品,只有客户),它运行正常。我怎样才能获得产品?

更新:订购了两个或更多产品后,客户必须在其输出上出现与其订购产品一样多的次数。我希望输出一个包含5列的表:

Cust ID | Cust Name | Cust City | Prod ID | Prod Name | Prod Price

在SQL中是否可以使用group by?收缩它可以在不同的桌子上使用多个列吗?

2 个答案:

答案 0 :(得分:2)

试试这个:

SELECT distinct c。*,p。*
来自客户c
加入
(选择o.customer_id cid
来自产品P
加入订单o
ON p.id = o.product_id
GROUP BY o.customer_id
具有COUNT(不同的o.product_id)> = 2)cp
ON c.id = cp.cid
加入订单o
在c.id = o.customer_id
加入产品p
ON o.product_id = p.id

我希望它能解决你的问题。

答案 1 :(得分:1)

我认为您可以对此问题使用以下查询 -

SELECT C1.*, p1.*
  FROM Customer C1
  JOIN Orders O1 ON O1.Customer_Id = C1.Id
  JOIN Product P1 ON P1.Id = O1.Product_Id
 WHERE C1.Id IN (SELECT c.Id
                   FROM Customer c
                   JOIN Orders o ON o.Customer_Id = c.Id
                  GROUP BY (c.Id)
                 HAVING COUNT(DISTINCT o.Product_Id) >= 2)