postgresql Postgres 中的连接行
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/12370083/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Concat rows in Postgres
提问by t Book
Given is a Postgres table like this
给定的是这样的 Postgres 表
nummer vorname name cash
------|-----------|-----------|-----
1 paul smith 500
2 andy london 700
2 mike dover 700
3 clara winchester 200
To query this table my sql looks like this right know:
要查询此表,我的 sql 看起来像这样正确知道:
SELECT
nummer,
vorname,
name,
cash as total
FROM
data.myTable
GROUP BY
nummer,
name,
vorname,
cash
ORDER BY
nummer;
Is it possible to concat the two rows where nummeris the same (in this case 2).
Means my output should look like this (cash will also have the same values if the numbers are equal):
是否可以连接nummer相同的两行(在这种情况下2)。意味着我的输出应该是这样的(如果数字相等,现金也将具有相同的值):
nummer vorname name cash
------|-----------|-----------|-----
1 paul smith 500
2 andy london 700
mike dover
3 clara winchester 200
回答by Erwin Brandstetter
Use GROUP BYand the aggregate functioin string_agg():
使用GROUP BY和聚合函数string_agg():
SELECT nummer
,string_agg(vorname, E'\n') AS vorname
,string_agg(name, E'\n') AS name
,cash
FROM mytable
GROUP BY nummer, cash
ORDER BY nummer, cash;
I added cashto the GROUP BYto get to the original value and safeguard against the case where it would be different for the same nummer.
我添加cash到GROUP BY以获取原始值并防止相同nummer.
As to your comment:
至于你的评论:
is it possible to unique the query also by names. means if 2|andy london|700 is listed twice one should be removed.
是否也可以通过名称来唯一查询。意味着如果 2|andy london|700 被列出两次,则应该删除一个。
SELECT nummer
,string_agg(vorname, E'\n') AS vorname
,string_agg(name, E'\n') AS name
,cash
FROM (
SELECT DISTINCT
nummer, vorname, name, cash
FROM mytable
) AS m
GROUP BY nummer, cash
ORDER BY nummer, cash;
回答by Chris Travers
SELECT nummer,
array_to_string(array_agg(vorname), E'\n'),
array_to_string(array_agg(name), E'\n'),
cash
FROM mytable
group by nummer, cash;
That should do it.
那应该这样做。

