Concat rows in Postgres

一个人想着一个人 提交于 2019-12-24 16:48:51

问题


Given is a Postgres table like this

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:

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 nummer is 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  vorname    name        cash
------|-----------|-----------|-----
1       paul       smith       500
2       andy       london      700
        mike       dover       
3       clara      winchester  200

回答1:


Use GROUP BY and the aggregate functioin 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 cash to the GROUP BY to get to the original value and safeguard against the case where it would be different for the same 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.

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;



回答2:


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.



来源:https://stackoverflow.com/questions/12370083/concat-rows-in-postgres

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!