【问题标题】:postgresql group by and inner joinpostgresql 分组和内部连接
【发布时间】:2014-08-25 14:16:01
【问题描述】:

我想要一个同时执行INNER JOINGROUP BY 的SQL 查询。我尝试了以下不起作用:

SELECT customer.first_name, SUM(payment.amount)
FROM customer
GROUP BY customer.customer_id
INNER JOIN payment
ON payment.customer_id = customer.customer_id;

提前谢谢你!

【问题讨论】:

标签: sql postgresql group-by inner-join


【解决方案1】:

您想按 customer_id 分组,但获得 first_name?

SELECT customer.first_name, SUM(payment.amount)
FROM customer
INNER JOIN payment
ON payment.customer_id = customer.customer_id
GROUP BY customer.customer_id, customer.first_name;

您也可以在派生表中进行聚合,然后您可以从客户那里获得额外的列:

SELECT customer.first_name, SumPayment
FROM customer
INNER JOIN 
 (
   SELECT customer_id,
          SUM(payment.amount) AS SumPayment
   FROM payment
   GROUP BY customer_id
 ) AS payment
ON payment.customer_id = customer.customer_id

【讨论】:

  • 你的内部查询有错误,GROUP BY应该在FROM之后吧?
  • @SushinPv:当然,修复它。实际上,Teradata 的解析器只要以 Select 开头,就不会抱怨关键字的顺序错误。
【解决方案2】:

首先,GROUP BY 出现在查询的末尾(如果有的话,就在 order byhaving 子句之前)。

那么,select中所有不在聚合函数中的字段都必须在group by子句中。

所以

SELECT customer.first_name, SUM(payment.amount)
FROM customer
INNER JOIN payment
ON payment.customer_id = customer.customer_id
GROUP BY  customer.first_name;

但是具有相同名字的客户将被分组,这可能不是您真正想要的。

相当

SELECT  customer.first_name, SUM(payment.amount)
FROM customer
INNER JOIN payment
ON payment.customer_id = customer.customer_id
GROUP BY  customer.first_name, customer.customer_id;

【讨论】:

  • 谢谢,这就是我要找的! postgres tutorial 让我很困惑,因为他们说你必须将 GROUP BY 子句放在 FROMWHEREclause 之后。
  • 如果我想在上面的查询中添加一个WHERE子句,比如WHERE SUM(payment.amount) > 100
  • @Criesto 如果要过滤分组字段,则应添加 HAVING 子句:HAVING SUM(payment.amount) > 100(在 group by 子句之后)
  • GROUP BY customer.id 还不足以得到预期的结果吗?
  • @pkaramol customer.id 不在 select 子句中,而 customer.first_name 在。根据您的 DBMS,您的解决方案会引发错误。
猜你喜欢
  • 2012-09-01
  • 2012-12-09
  • 2019-12-18
  • 1970-01-01
  • 2012-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-08
相关资源
最近更新 更多