sql - SQL Server 中 SUM() 的对应项是什么?

标签 sql sql-server t-sql aggregate-functions

SQL Server 中,您可以执行 sum(field1) 来获取与 groupby 子句匹配的所有字段的总和。
但我需要减去字段,而不是求和。
是否可以使用 subtract(field1) 之类的东西来代替 sum(field1) ?

例如,table1 有以下内容:

name field1  
A 1  
A 2  
B 4  

查询:

select name, sum(field1), subtract(field1)  
from table1  
group by name  

会给我:

A 3 -1  
B 4 4 

我希望我的问题很清楚。

编辑:

还有一个我可以使用的排序字段。 这可以确保值 1 和 2 始终会导致 -1 而不是 1。

我需要减去 A 的所有值,在我的示例中为 1 - 2 = -1

编辑2: 如果 A 组的值为 1、2、3、4,则结果必须为 1 - 2 - 3 - 4 = -8

最佳答案

假设您有一些列来指示顺序,要选择每组的第一个元素,您可以使用窗口函数来计算您的减法:

CREATE TABLE tab(ID INT IDENTITY(1,1) PRIMARY KEY, name CHAR(1), field1 INT);
INSERT INTO tab(name, field1) VALUES ('A', 1), ('A', 2), ('B', 4);

SELECT DISTINCT 
   name
   ,[sum]       = SUM(field1) OVER (PARTITION BY name)
   ,[substract] = SUM(-field1) OVER (PARTITION BY name) 
                  + 2*FIRST_VALUE(field1) OVER(PARTITION BY name ORDER BY ID)
FROM tab;

LiveDemo

输出:

╔══════╦═════╦═══════════╗
║ name ║ sum ║ substract ║
╠══════╬═════╬═══════════╣
║ A    ║   3 ║        -1 ║
║ B    ║   4 ║         4 ║
╚══════╩═════╩═══════════╝

警告:

FIRST_VALUE 可从 SQL Server 2012+

关于sql - SQL Server 中 SUM() 的对应项是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36545274/

相关文章:

sql-server - .NET 世界中 Streaminsight 的替代品

sql-server - 在 CREATE DATABASE 中使用 InstanceDefaultDataPath 和 InstanceDefaultLogPath

sql-server - 合并到没有行

mysql - 带有 SELECT 结果的 SQL 更新

mysql - 截断与删除

SQL - 查询存储不一致的电话号码

sql - 用上一行更新当前行 sql server

sql - 如何将sql中的前缀添加到表sales中的 'invoice_id'列

mysql - 查询以获取表中最接近的日期

sql-server - 无法删除数据库用户,因为该用户当前已登录。错误15434