Select Postgresql 中带计数的数据
Select Data with Count in Postgresql
我想问一下如何把select数据和统计数据一起做
在这种情况下,我希望用户出现以及他拥有的交易数量。
喜欢我制作的这段代码。
SELECT "transaction"."user_id",
COUNT(transaction.id) trans_count
FROM transaction
inner join "users" on "users"."id" = "transaction"."user_id"
GROUP BY user_id
上面的代码成功 selects user_id
和 trans_count
,但是当我试图显示 users.name
出现此错误消息。
Error in query: ERROR: column "users.name" must appear in the GROUP BY
clause or be used in an aggregate function LINE 3: "users"."name"
我统计数据的时候是真的不能select其他数据还是有更好的办法?
谢谢。
您可以在 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_id
和 user.name
具有一对一的映射关系,因此您可以简单地在 group by
子句中包含 name
。
否则,您必须告诉 DBMS 如何 select 从每组中的多个记录中提取一个值,例如:
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 支持通过 table 中的唯一键进行聚合,还支持在 SELECT
中包含未聚合的列。这是来自 SQL 标准的 "functional dependent" 聚合的实现。
当您使用 transactions.user_id
时,Postgres 不识别功能依赖(即使您可能认为 ON
子句会暗示它)。所以,您的代码不起作用。
替代方法是将 user_name
也添加到 GROUP BY
。但是,如果您使用正确 table.
中的列,您的版本几乎可以正常工作
我想问一下如何把select数据和统计数据一起做
在这种情况下,我希望用户出现以及他拥有的交易数量。
喜欢我制作的这段代码。
SELECT "transaction"."user_id",
COUNT(transaction.id) trans_count
FROM transaction
inner join "users" on "users"."id" = "transaction"."user_id"
GROUP BY user_id
上面的代码成功 selects user_id
和 trans_count
,但是当我试图显示 users.name
出现此错误消息。
Error in query: ERROR: column "users.name" must appear in the GROUP BY clause or be used in an aggregate function LINE 3: "users"."name"
我统计数据的时候是真的不能select其他数据还是有更好的办法?
谢谢。
您可以在 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_id
和 user.name
具有一对一的映射关系,因此您可以简单地在 group by
子句中包含 name
。
否则,您必须告诉 DBMS 如何 select 从每组中的多个记录中提取一个值,例如:
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 支持通过 table 中的唯一键进行聚合,还支持在 SELECT
中包含未聚合的列。这是来自 SQL 标准的 "functional dependent" 聚合的实现。
当您使用 transactions.user_id
时,Postgres 不识别功能依赖(即使您可能认为 ON
子句会暗示它)。所以,您的代码不起作用。
替代方法是将 user_name
也添加到 GROUP BY
。但是,如果您使用正确 table.