2017-05-25 84 views
1

我有我的數據,有可能爲每個地址大約50記錄:如何在T-SQL中添加每行?

Id AddressId Income Expense Revenue 
---------------------------------------- 
1 1   100  200  300 
2 1   150  20  200 
3 1   160  80  800 
4 1   50  90  200 
5 1   600  700  500 

現在我需要的格式如下數據:被添加

Ids  Count Income Expense Revenue 
--------------------------------------- 
1   1 100  200  300 
1,2   2 250  220  500 
1,2,3  3 410  300 1300 
1,2,3,4  4 460  390 1500 
1,2,3,4,5 5 1060 1090 2000 

每一行此起彼伏。

例如:

  • Ids 1,2是編號1的總和和2
  • Ids 1,2,3被編號1的總和和2和3等

我不t需要Ids列,唯一需要的是總和

+0

這聽起來似乎是微不足道的消耗數據的代碼做的,笨拙的TSQL –

+0

做@MarcGravell其實很容易與TSQL做,只要你不工作的一個真正的舊版本,使用'over'子句與'sum'和屬性'partition by'和'order by'使它在公園散步... –

回答

3

你可以使用STUFFROW_NUMBER() OVER(),並SUM() OVER()這樣

DECLARE @SampleData AS TABLE 
(
    Id int, 
    AddressId int, 
    Income int, 
    Expense int, 
    Revenue int 
) 

INSERT INTO @SampleData 
VALUES 
(1, 1, 100, 200, 300), 
(2, 1, 150, 20 , 200), 
(3, 1, 160, 80 , 800), 
(4, 1, 50 , 90 , 200), 
(5, 1, 600, 700, 500) 

SELECT 
     STUFF(
      (
      SELECT ',' + CAST(sd1.Id AS varchar(10)) 
      FROM @SampleData sd1 
      WHERE sd1.AddressId = sd.AddressId AND sd1.Id <= sd.Id 
      FOR XML PATH('') 
      ), 
      1,1,'') AS Ids, 
     Row_number() OVER(PARTITION BY sd.AddressId ORDER BY sd.Id) AS Count, 
     sum(sd.Income) OVER(PARTITION BY sd.AddressId ORDER BY sd.Id) AS Income, 
     sum(sd.Expense) OVER(PARTITION BY sd.AddressId ORDER BY sd.Id) AS Expense, 
     sum(sd.Revenue) OVER(PARTITION BY sd.AddressId ORDER BY sd.Id) AS Revenue 
FROM @SampleData sd 
ORDER BY sd.AddressId, sd.Id 

演示鏈接:http://rextester.com/HRIWH92029

注意:最後的收入應該是2000而不是1600

1

如果您使用SQL server 2012及更高版本,請使用下面的查詢求和總計Ë以前行

Select ID, 
count(*) OVER (PARTITION by AddressID 
ORDER BY ID 
ROWS BETWEEN unbounded PRECEDING AND current row) as[Count], 
sum(Income) OVER (PARTITION by AddressID 
ORDER BY ID 
ROWS BETWEEN unbounded PRECEDING AND current row) Income, 
sum(Expense) OVER (PARTITION by AddressID 
ORDER BY ID 
ROWS BETWEEN unbounded PRECEDING AND current row)Expense, 
sum(Revenue) OVER (PARTITION by AddressID 
ORDER BY ID 
ROWS BETWEEN unbounded PRECEDING AND current row) Revenue from TableName 
0

如果您使用的是SQL Server 2008及以下版本,請使用下面的查詢來總結前面的行。

Select ID, (select count(*) from Tablename A where A.Id<=Tablename.ID)[Count], 
(select sum(Income) from Tablename A where A.Id<=Tablename.ID) Income, (select 
sum(Expense) from Tablename A where A.Id<=Tablename.ID) Expense, (select 
sum(Revenue) from Tablename A where A.Id<=Tablename.ID) Revenue from Tablename