对串联列求和 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
如何获取净收入列?
正确的解决方案是通过为客户及其各自的 pre
和 post
添加单独的 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))
。
我想使用 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
如何获取净收入列?
正确的解决方案是通过为客户及其各自的 pre
和 post
添加单独的 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))
。