1

也许有人可以通过 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,   

谢谢你的帮助,

托尼

4

1 回答 1

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;

看到这个 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_string,查询被简单地重写以使用。array_agg

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

于 2012-11-05T07:45:22.197 回答