2

PostgreSql データベースで 3 つのテーブルを次のように使用しています。

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

そして、クエリを実行して、「製品と一緒に少なくとも2つの異なる製品を注文した顧客」を取得したいと考えています。私が書くクエリは次のとおりです。

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

エラーがスローされます:

"列 "p.id" は GROUP BY 句に指定するか、集計関数 LINE 1 で使用する必要があります: select c.*, p.*".

ただし、select ステートメントから p.* を削除すると (製品は必要なく、顧客のみが必要であると仮定して)、問題なく動作します。また、どうすれば商品を手に入れることができますか?

更新: 2 つ以上の製品を注文した顧客は、注文した製品の数だけ出力に表示される必要があります。5列のテーブルを出力したい:

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

使用する必要があることを考えると、SQLでそれは可能group byですか? 異なるテーブルの複数の列で使用する必要がありますか?

4

2 に答える 2

2

これを試してください:

SELECT distinct c.* ,p.*
FROM Customer c
JOIN
   (SELECT o.customer_id cid
    FROM Product P
    JOIN Orders o
    ON p.id= o.product_id
    GROUP BY o.customer_id
    HAVING COUNT(distinct o.product_id)>=2) cp
ON c.id =cp.cid
JOIN Orders o
on c.id=o.customer_id
JOIN Product p
ON o.product_id =p.id

問題が解決することを願っています。

于 2013-05-20T09:22:10.100 に答える
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)
于 2013-05-20T09:14:39.400 に答える