获取连接列 SQL 的总和

Posted

技术标签:

【中文标题】获取连接列 SQL 的总和【英文标题】:Take sum of a concatenated column SQL 【发布时间】:2021-11-01 01:55:56 【问题描述】:

我想使用互动的后期和前期收入来计算净收入。有时,交互中有多个客户。数据如下:

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

预期输出是在调用前后求和以计算净值

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

如何获得净收入列?

【问题讨论】:

如果有超过 1 个客户,您希望 (20+10) - (15+30) 作为您的网络吗? @Arun 是的,以上是正确的。也可以有 2 个以上的客户。客户数量应该是动态的。 【参考方案1】:

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

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

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小提琴here

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

对于旧版本,请替换为 regexp_split_to_table()unnest(string_to array))

【讨论】:

以上是关于获取连接列 SQL 的总和的主要内容,如果未能解决你的问题,请参考以下文章

如何从连接中的一组记录中获取列的总和?

连接表以获取总和 - SQL/Access

SQL 连接查询以获取借方余额不等于 0 的借方余额的项目名称、日期和总和?

使用右表上的总和分组对多列进行 SQL 连接

SQL通过联结表从其他表中选择总和作为列

通过 group by 和 joins 获取多个表的多个列的总和