繁体   English   中英

在 Postgresql 中选择带计数的数据

[英]Select Data with Count in 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_idtrans_count ,但是当我尝试显示users.name

出现此错误消息。

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

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

谢谢你。

您可以group by以下方式在group by包含user.name

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

否则,当 DBMS 尝试将多行组合( group )为一行时,它不知道应该选择哪个name值,这就是它抛出错误的原因。

在这种情况下, user_iduser.name具有一对一的映射关系,因此您可以简单地在group by子句中包含name

否则,您必须告诉 DBMS 如何从每组中的多个记录中选择一个值,例如:

min(user.name)max(user.name)

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

当您使用GROUP BY您必须按所有正在获取或使用聚合函数的列进行分组

分组依据(与@rohitvats 相同)

GROUP BY "transaction"."user_id", "user"."name"

- - 或者 - -

聚合函数MAX() , MIN()

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

如果您按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_name添加到GROUP BY中。 但是,如果您使用正确表中的列,您的版本几乎可以正常工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM