我在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
?收缩它可以在不同的桌子上使用多个列吗?
答案 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)