SQL Server-求和值并将其添加到所有相同的ID

SQL Server-求和值并将其添加到所有相同的ID,sql,sql-server,Sql,Sql Server,我是一个SQL初学者(显然)。我有以下情况,我被卡住了 由于我将在第二步中删除下表中的重复数据,因此我首先要确保所有用户的支出在之前都已汇总 我只能使用SELECT语句。任何关于从这里开始的提示都很好 ID | Firstname | Lastname | spending ---+-----------+----------+----------- 01 | John | Smith | 5 01 | John | Smith | 2 01 | J

我是一个SQL初学者(显然)。我有以下情况,我被卡住了

由于我将在第二步中删除下表中的重复数据,因此我首先要确保所有用户的支出在之前都已汇总

我只能使用SELECT语句。任何关于从这里开始的提示都很好

ID | Firstname | Lastname | spending
---+-----------+----------+-----------
01 | John      | Smith    |    5 
01 | John      | Smith    |    2
01 | John      | Smith    |  
02 | Tobi      | Miller   |  
02 | Tobi      | Miller   |  
02 | Tobi      | Miller   |  
03 | Kelly     | Schult   |    3 
03 | Kelly     | Schult   |    2 
03 | Kelly     | Schult   |    1
预期结果:

ID | Firstname | Lastname | spendings
---+-----------+----------+-----------
01 | John      | Smith    |    7 
01 | John      | Smith    |    7
01 | John      | Smith    |    7 
02 | Tobi      | Miller   |  
02 | Tobi      | Miller   |  
02 | Tobi      | Miller   |  
03 | Kelly     | Schult   |    6 
03 | Kelly     | Schult   |    6 
03 | Kelly     | Schult   |    6

使用窗口功能:

SELECT ID,
       Firstname, Lastname,
       SUM(spending) OVER (PARTITION BY ID) AS Spendings
FROM YourTable;

我将按ID分组,并对支出列求和:

 SELECT *, SUM(spendings) FROM YourTable GROUP BY ID

此外,这将删除重复的结果。

SQL Server包含许多可用于对数据进行分区的结果

在本例中,我将函数与over子句组合在一起

-- Table vars are a great way to share test data.
DECLARE @Example TABLE
(
    ID          INT,
    FirstName   VARCHAR(50),
    LastName    VARCHAR(50),
    Spending    MONEY
);

-- Values from OP.
INSERT INTO @Example
(
    ID,
    FirstName,
    LastName,
    Spending
)
VALUES
    (1, 'John', 'Smith', 5),
    (1, 'John', 'Smith',  2),
    (1, 'John', 'Smith', 0),
    (2, 'Tobi', 'Miller', 0),
    (2, 'Tobi', 'Miller', 0),
    (2, 'Tobi', 'Miller', 0),
    (3, 'Kelly', 'Schult', 3),
    (3, 'Kelly', 'Schult', 2),
    (3, 'Kelly', 'Schult', 1)
;

-- Sub totals.
SELECT
    ID,
    FirstName,
    LastName,
    SUM(Spending) OVER (PARTITION BY ID) AS Spendings
FROM
    @Example
;
您提到您计划在第二步中消除重复数据。我的建议是总是先整理数据。处理数据集中的复杂性或缺陷总是使后面的步骤更加复杂。在这种情况下,好的第一个查询可能是:

-- Alternative, clear and total in one step.
SELECT
    ID,
    FirstName,
    LastName,
    SUM(Spending) AS Spendings
FROM
    @Example
GROUP BY
    ID,
    FirstName,
    LastName
;
输出

ID  FIRST_N LAST_N  SPENDING
1   John    Smith   7
1   John    Smith   7
1   John    Smith   7
2   Tobi    Miller  0
2   Tobi    Miller  0
2   Tobi    Miller  0
3   Kelly   Schult  6
3   Kelly   Schult  6
3   Kelly   Schult  6

正如我对Jayasurya Satheesh说的,这里没有必要扫描表两次。窗口函数和聚合函数都可以避免额外的IO。
ID  FIRST_N LAST_N  SPENDING
1   John    Smith   7
1   John    Smith   7
1   John    Smith   7
2   Tobi    Miller  0
2   Tobi    Miller  0
2   Tobi    Miller  0
3   Kelly   Schult  6
3   Kelly   Schult  6
3   Kelly   Schult  6