首页 > 解决方案 > 在 Postgresql 中选择带有计数的数据

问题描述

我想问我如何选择数据和计数数据。

在这种情况下,我希望用户出现以及他拥有的交易数量。

就像我制作的这段代码一样。

SELECT "transaction"."user_id",
COUNT(transaction.id) trans_count
FROM transaction 
inner join "users" on "users"."id" = "transaction"."user_id"
GROUP BY user_id

上面的代码成功选择了user_idand trans_count,但是当我试图显示users.name

出现此错误消息。

查询错误:错误:列“users.name”必须出现在 GROUP BY 子句中或用于聚合函数第 3 行:“users”.“name”

当我计算数据时我无法选择其他数据是真的还是有更好的方法?

谢谢你。

标签: sqlpostgresqllaravel-query-builder

解决方案


如果您按以下方式聚合,users.id您的代码将起作用:

SELECT u.id, u.user_name, COUNT(*) as trans_count
FROM users u JOIN
     transaction t
     ON t.id = u.user_id
GROUP BY u.id;

(我删除了双引号,因为它们使逻辑混乱,没有必要解释发生了什么。)

为什么?据推测,users.id是唯一的(或等效的主键)。Postgres 支持通过表中的唯一键进行聚合,还支持在SELECT. 这是来自 SQL 标准的“功能相关”聚合的实现。

当您使用 时transactions.user_id,Postgres 不会识别功能依赖(即使您可能认为该ON子句会暗示它)。所以,你的代码不起作用。

另一种方法是添加user_nameGROUP BY以及。但是,如果您使用正确表中的列,您的版本几乎可以工作。


推荐阅读