SQL Server - Sum值并添加到所有相同的ID

问题描述 投票:2回答:4

我是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
sql sql-server
4个回答
3
投票

使用窗口函数:

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

1
投票

我会按ID分组并将花费列总结:

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

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


1
投票

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

在这个例子中,我将sum函数与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
;

0
投票
DECLARE @TAB TABLE (ID INT, FIRST_N VARCHAR(20),LAST_N VARCHAR(20),SPENDING INT)

INSERT INTO @TAB VALUES (01 , 'John' , 'Smith' , 5 ),
(01 , 'John' , 'Smith' , 2),
(01 , 'John' , 'Smith',0 )  ,
(02 , 'Tobi' , 'Miller',0 ) , 
(02 , 'Tobi' , 'Miller',0) ,
(02 , 'Tobi' , 'Miller',0 )  ,
(03 , 'Kelly' , 'Schult' , 3 ),
(03 , 'Kelly' , 'Schult' , 2 ),
(03 , 'Kelly' , 'Schult' , 1)


;WITH CTE AS
(
SELECT T.ID,T.FIRST_N,T.LAST_N,SUM(SPENDING) AS SPENDING
FROM @TAB T
GROUP BY T.ID,T.FIRST_N,T.LAST_N
)

SELECT T.ID,T.FIRST_N,T.LAST_N,C.SPENDING 
FROM @TAB T
INNER JOIN CTE  C ON C.ID = T.ID

OUTPUT

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
© www.soinside.com 2019 - 2024. All rights reserved.