我是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
答案 0 :(得分:3)
使用窗口函数:
SELECT ID,
Firstname, Lastname,
SUM(spending) OVER (PARTITION BY ID) AS Spendings
FROM YourTable;
答案 1 :(得分:1)
我会按ID分组,并将花费列总结:
SELECT *, SUM(spendings) FROM YourTable GROUP BY ID
此外,这将删除重复的结果。
答案 2 :(得分: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
;
答案 3 :(得分: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
输出
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