分组依据和内部联接:如何选择没有" max"特技

时间:2017-02-21 10:02:15

标签: sql postgresql aggregate

这是一个简单的查询:

SELECT orders.id, customers.name, COUNT(order_product.id)
FROM orders
INNER JOIN order_product ON orders.id = order_product.order_id
INNER JOIN customers ON orders.customer_id = customers.id
GROUP BY orders.id;

换句话说,我想:

  • 订单的ID。
  • 每个订单中的产品数量(计数)。
  • 订单的客户名称。

问题在于选择customers.name。我不能直接选择它,因为它不是聚合函数,也不是group by。但只有一个,所以我知道为什么要聚合它。我可以这样做一个技巧来选择它的名字:

SELECT MAX(customers.name)

但我认为这很脏,因为我不想要订购客户的最大名称"但是"订单的客户名称"。 做这种事情的优雅方式是什么?

希望它清楚,不重复。

编辑 :订单只有orders.customer_id标识的一位客户。这就是为什么我问为什么我必须做这样的伎俩。

2 个答案:

答案 0 :(得分:1)

将customers.name添加到GROUP BY子句:

SELECT orders.id, customers.name, COUNT(order_product.id)
FROM orders
INNER JOIN order_product ON orders.id = order_product.order_id
INNER JOIN customers ON orders.customer_id = customers.id
GROUP BY orders.id, customers.name

通常,您可以简单地按所有选定列进行分组,这些列不是设置函数的参数!

答案 1 :(得分:1)

或者,您可以使用窗口函数

SELECT DISTINCT orders.id, customers.name, COUNT(order_product.id) OVER ( PARTITION BY orders.id)
FROM orders
INNER JOIN products ON orders.id = order_product.order_id
INNER JOIN customers ON orders.customer_id = customers.id;