sql - 分组依据和内连接 : how to select joined without a "max" trick

标签 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。我不能直接选择它,因为它不在聚合函数中,也不在分组依据中。但是只有一个,所以我不知道为什么要聚合它。我可以用这样的技巧来选择它的名字:

SELECT MAX(customers.name)

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

希望它是清楚的,而不是重复的。

编辑:一个订单只有一个客户,由 orders.customer_id 标识。这就是为什么我问为什么我必须做这样的把戏。

最佳答案

将 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

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

关于sql - 分组依据和内连接 : how to select joined without a "max" trick,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42364198/

相关文章:

sql - 如何在 SELECT 部分中包含 BIT 类型列而不将其包含在 T-SQL 中的 GROUP BY 中?

sql - 复杂的 SQL 查询(至少对我而言)

postgresql - 臭名昭著的 java.sql.SQLException : No suitable driver found

mongodb - 聚合组多个结果

scala - Spark - 对一列进行分组并查找其他列的平均值

postgresql 登录到另一个有冲突的表

sql - 更新或删除违反外键约束

sql - mysql查询性能

MySQL 解决方法,它们不能一起工作 - ROWNUM

sql-server - 在 SQL Server 和 Postgresql 中将字符串转换为 datetimeoffset