sql - PostgreSQL 中同名列的总和

标签 sql postgresql sum

我有一个结构如下的表:

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 列添加 amounttotal 列(我需要 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/

相关文章:

ruby-on-rails - 在 heroku 命令中安排备份失败

sql - 尝试分析两个时间间隔 - 我的 WHERE 子查询返回太多行

sum - Verilog:对 n 个寄存器求和

mysql - 关于订单类型(购买/返回)的最多订单的 SQL 查询?

mysql - 如何获取特定值的最大日期和舞台名称?

sql - 如何使用 SQL Server 对 SQL Server 查询进行基准测试

java - 编写具有多个子元素限制的 Hibernate Criteria API 查询

sql - 尽管有缓存,搜索查询的性能还是被共同好友限制了 98%

postgresql - Flask sqlAlchemy 手册 ORM : 'RelationshipProperty' object has no attribute 'parent'

arrays - 更好地在 int 数组之间求和