2017-12-20 4 views
2

私はSQLの初心者です(明らかに)。私は、次のような状況に陥っています。SQL Server - 値の合計とすべての同一IDへの追加

次の表を第2段階で重複排除する予定であるため、私はすべてのユーザーの支出を前もって集計しています。

私は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 

答えて

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 
; 

2番目の手順でデータを削除するとします。私のアドバイスは、常にあなたのデータを整理することです。データセットの複雑さや脆弱性を回避することは、後のステップをより複雑にします。この場合、良い最初のクエリは次のようになります。

-- 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 
+0

私はジャヤサヤSatheeshに言ったように、二回ここにテーブルをスキャンする必要はありません。 Window関数とAggregate関数の両方が余分なIOを避けることができます。 – Larnu

関連する問題