【问题标题】:Fetch data from more than one tables using Group By使用 Group By 从多个表中获取数据
【发布时间】:2013-05-20 08:16:52
【问题描述】:

我在 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

鉴于应该使用group by,SQL 中是否有可能?应该在不同表的多个列上使用它吗?

【问题讨论】:

  • 你能发布想要的输出吗?
  • 请提供好的信息。

标签: sql database postgresql join group-by


【解决方案1】:

试试这个:

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

希望它能解决你的问题。

【讨论】:

    【解决方案2】:

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

    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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-19
      • 2014-10-05
      • 1970-01-01
      • 2018-06-04
      • 1970-01-01
      • 2016-06-08
      • 1970-01-01
      • 2011-01-27
      相关资源
      最近更新 更多