sql - 将多行的值汇总到一个新列中

标签 sql sql-server stored-procedures

我有一个存储过程返回一个如下所示的表:

ID | Type | Price | Description
-------------------------------
2  | J    | 40.00 | Job
2  | F    | 10.00 | Freight
2  | P    | 20.00 | Postage
2  | F    |  5.00 | Handling
7  | J    | 50.00 | Job
7  | F    | 20.00 | Freight
7  | P    | 30.00 | Postage
7  | H    |  5.00 | Handling

我希望它像这样返回表格:

ID | Type | Price | Description | FreightPrice
-----------------------------------------
2  | J    | 40.00 | Job         | 15.00
2  | F    | 10.00 | Freight     | 15.00    
2  | P    | 20.00 | Postage     | 15.00
2  | F    |  5.00 | Freight     | 15.00
7  | J    | 50.00 | Job         | 20.00
7  | F    | 20.00 | Freight     | 20.00
7  | P    | 30.00 | Postage     | 20.00
7  | H    |  5.00 | Handling    | 20.00

预期结果会将每个唯一 ID 的总运费加总到其自己的列中,即 ID#2 总 FreightPrice 为 15.00 美元。

我尝试使用以下方法来获得该结果

FreightPrice = (SELECT SUM(Price) 
                FROM Table
                WHERE Type = 'F' AND ID >= 2 AND ID <= 7)

问题是它返回 $35.00 的 FreightPrice,因为它对类型“F”的所有实例求和。

我是否需要将它们分成两个不同的子查询,或者有人知道用一个子查询实现此目的的方法吗?

最佳答案

你似乎想要一个窗口函数:

select t.*,
       sum(case when description = 'freight' then price end) over (partition by id) as freightprice
from t;

关于sql - 将多行的值汇总到一个新列中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55692980/

相关文章:

c# - 从 C# 代码调用时查询抛出异常

mysql - 连接两个表,结果显示在表 2 的 min() 字段上

java - 从Java读取的SQL存储过程文本

java - 将对象数组从 Java 传递到 PLSQL 存储过程

sql - DB2:如何在 DB2 中连接空字符串?

MySQL 错误 1064 - 我瞎了吗?奇怪的错误

sql - 为什么 SQL Server 突然决定使用这么可怕的执行计划?

python - 使用 Flask-SQLAlchemy 中的存储过程调用将 POST 方法发送到 SQL

mysql - 优化mysql View ,将多条记录合并为一条记录

sql - orientdb sql 查询以选择边和顶点字段属性。