对串联列求和 SQL

Take sum of a concatenated column SQL

我想使用 post 和交互的预收入来计算净收入。有时一次交互中有多个客户。数据是这样的:

InteractionID | Customer ID |   Pre  |  Post
--------------+-------------+--------+--------
      1       | ab12        |   10   |  30
      2       | cd12        |   40   |  15
      3       | de12;gh12   | 15;30  | 20;10

预期输出是在 pre 和 post 调用中求和以计算 net

    InteractionID | Customer ID   |   Pre  |  Post | Net 
    --------------+---------------+--------+-------+------
          1       |  ab12         |   10   |  30   | 20
          2       |  cd12         |   40   |  15   | -25
          3       |  de12;gh12    |   45   |  30   | -15

如何获取净收入列?

正确的解决方案是通过为客户及其各自的 prepost 添加单独的 table 来规范您的关系设计。

虽然坚持当前的设计,但这样做就可以了:

SELECT *, post - pre AS net
FROM (
   SELECT interaction_id, customer_id 
         ,(SELECT sum(x::numeric) FROM string_to_table(pre, ';') x) AS pre
         ,(SELECT sum(x::numeric) FROM string_to_table(post, ';') x) AS post
   FROM   tbl
   ) sub;

db<>fiddle here

string_to_table() 至少需要 Postgres 14。
您没有声明您的 Postgres 版本,所以我假设当前版本是 Postgres 14。

旧版本替换为 regexp_split_to_table()unnest(string_to array))