我在Postgres 9.6工作。我有一个名为people
的表:
Table "public.people"
Column | Type | Modifiers
------------------+-------------------+-----------
name | character varying | not null
address | character varying |
每个人都有一个唯一的名字,但可能会共享一个地址。
一个名为assets
的表,由人民拥有的资产:
Table "public.assets"
Column | Type | Modifiers
--------------------+----------------------+-------------
id | character varying |
person_name | character varying |
value | integer |
person_name
中的assets
字段与name
中people
字段的标识符相同,因此可以连接这两个表。
我希望找到按值分配最多资产的地址。但困难在于我也希望我的结果包含一些名称(一个名称或所有名称)。
这是因为他们自己的地址并没有告诉我很多 - 如果他们有一些名字,那么理解结果会容易得多。
我知道如何检索每个人拥有的资产的价值:
SELECT
person_name, SUM(value) as total_value
FROM assets
GROUP BY person_name
我知道如何加入并将其分组以按地址获取总价值:
SELECT
p.address, SUM(a.total_value) FROM people p
JOIN
(SELECT person_name, SUM(value) as total_value
FROM assets
GROUP BY person_name) a
ON
a.person_name=p.name
GROUP BY
p.address
ORDER BY total_value DESC;
但是如何在结果中检索一些名称 - 无论是单个名称还是整个名称?
答案 0 :(得分:0)
您应该在聚合函数中使用name
,例如
SELECT
p.address,
min(name) as name,
sum(a.total_value) as total_value
...
获取按字母顺序排列的名字,或
SELECT
p.address,
array_agg(name) as names,
sum(a.total_value) as total_value
...
获取数组中的所有名称。