簡體   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