我有一个结构如下的表:
op | name | amount | total |
1 | a | 40 | 2 |
2 | a | 80 | 4 |
5 | b | 30 | 5 |
6 | b | 50 | 7 |
1 | c | 20 | 1 |
3 | c | 30 | 4 |
我希望根据 name
列添加 amount
和 total
列(我需要 op
> 列继续出现)。对于此示例,我的选择将返回以下结果:
op | name | amount | total |
1 | a | 120 | 6 |
2 | a | 120 | 6 |
5 | b | 80 | 12 |
6 | b | 80 | 12 |
1 | c | 50 | 5 |
3 | c | 50 | 5 |
我可以使用 PostgreSQL 来完成此操作吗?
最佳答案
您可以使用窗口函数SUM() OVER
来实现
CREATE TABLE tab1 ( "op" INTEGER, "name" VARCHAR(1), "amount" INTEGER, "total" INTEGER ); INSERT INTO tab1 ("op", "name", "amount", "total") VALUES ('1', 'a', '40', '2'), ('2', 'a', '80', '4'), ('5', 'b', '30', '5'), ('6', 'b', '50', '7'), ('1', 'c', '20', '1'), ('3', 'c', '30', '4');
SELECT "op" , "name", SUM("amount") OVER (PARTITION BY "name") as "amount" , SUM("total") OVER (PARTITION BY "name") as "total" FROM tab1
op | name | amount | total -: | :--- | -----: | ----: 1 | a | 120 | 6 2 | a | 120 | 6 5 | b | 80 | 12 6 | b | 80 | 12 1 | c | 50 | 5 3 | c | 50 | 5
db<> fiddle here
关于sql - PostgreSQL 中同名列的总和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67523866/