postgres合并字段,sum和group by

时间:2012-11-05 07:39:29

标签: postgresql

也许有人可以通过postgres查询来帮助我。

表结构如下所示

  nummer   nachname   vorname   cash
 +-------+----------+----------+------+
   2       Bert       Brecht    0,758
   2       Harry      Belafonte 1,568
   3       Elvis      Presley   0,357
   4       Mark       Twain     1,555
   4       Ella       Fitz      0,333
   …

如何合并“nummer”相同的字段并将现金值相加? 我的输出应该如下所示:

   2       Bert, Brecht      2,326
           Harry, Belafonte 
   3       Elvis, Presley    0,357
   4       Mark, Twain       1,888
           Ella, Fitz   

我认为合并的部分应该是这样的:

 array_to_string(array_agg(nachname|| ', ' ||coalesce(vorname, '')), '<br />') as name,   

感谢您的帮助,

1 个答案:

答案 0 :(得分:1)

SELECT
  nummer, 
  string_agg(nachname||CASE WHEN vorname IS NULL THEN '' ELSE ', '||vorname END, E'\n') AS name,
  sum(cash) AS total_cash
FROM Table1
GROUP BY nummer;

this SQLFiddle;请注意,它不会在名称之间显示换行符,但它们仍然存在。

使用CASE语句而不是coalesce,因此对于具有姓氏但没有名字的条目,您没有尾随逗号。如果你想要一个尾随逗号,请使用format('%s, %s',vorname,nachname)代替并避免所有丑陋的字符串连接业务:

SELECT
  nummer, string_agg(format('%s, %s', nachname, vorname), E'\n'),
  sum(cash) AS total_cash
FROM Table1
GROUP BY nummer;

如果string_agg不起作用,请使用较新的PostgreSQL,或在问题中提及该版本,以便明确表示您使用的是过时的版本。该查询很容易被重写,无论如何都要使用array_to_stringarray_agg

如果您询问如何将sum数字实际表示为数据库中的1,2345文本字符串:不要那样做。修复您的架构。在输入和输出上格式化数字,将它们存储为numericfloat8integer,......无论作业的相应数字类型是什么。