sql - 在 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_id
and trans_count
,但是当我试图显示users.name
出现此错误消息。
查询错误:错误:列“users.name”必须出现在 GROUP BY 子句中或用于聚合函数第 3 行:“users”.“name”
当我计算数据时我无法选择其他数据是真的还是有更好的方法?
谢谢你。
解决方案
如果您按以下方式聚合,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
以及。但是,如果您使用正确表中的列,您的版本几乎可以工作。
推荐阅读
- java - 一旦用户读取它,如何将我的字符串限制在 001 和最大字符串到 999 实施条件之间
- sql - 具有多个 JOINS 的多个子查询 Oracle
- r - 使用keyword_search检测pdf时文件名太长?
- android - OkHttp 4.x 尝试通过呼叫请求访问 url 时出错
- c++ - 为什么在使用之前没有初始化 C++ const 模板化向量?
- javascript - 动画不是离子中的构造函数
- python-3.x - 计算两个字典之间的点积数百万次
- jenkins - Jenkins:同时使用“构建其他项目后构建”和“定期构建”
- apache-spark - 'YYYY-MM-dd' 和 'yyyy-MM-dd' 日期格式之间的 Spark-sql 区别
- java - Struts2 文件上传 - 未调用 execute()