需要基于类别的价值总和

时间:2013-07-30 10:50:36

标签: sql sql-server-2005 sum

表格中包含

等数据
<--------------------------->  
no      category     value 
<--------------------------->      
1        1           2000    
2        1           1000     
3        2            500    
4        3           3000    
5        1           2000   
6        2           -500        
7        3           5000    
8        1          -1000 

我希望输出像

<----------------------------------> 
no  category     amount       Sum   
<---------------------------------->   
1        1       2000         2000                
2        1       1000         3000                 
3        2        500          500                 
4        3       3000         3000                 
5        1       2000         5000                  
6        2       -500            0                 
7        3       5000         8000
8        1      -1000         4000 

例如:take category=1 所以,

no:1
amount=2000--->total=2000
no:2
amount=1000---->total=3000
no:5
amount=2000---->total=5000
no:8
amount=-1000---->total=4000

表示每行的每个类别的总和 并且具有更好的性能

3 个答案:

答案 0 :(得分:0)

您需要使用行号自行加入两个表:

;WITH t(No,Category,value,row) AS
(
    SELECT No, category, value
      ,ROW_NUMBER() OVER (Partition by category ORDER BY no) AS row
   FROM Table1
)
SELECT t1.No, t1.category, t1.value, sum(t2.value) as sums
  FROM t t1
  JOIN t t2
    ON t1.row >= t2.row
   AND t1.Category = t2.Category
 GROUP BY t1.No, t1.category, t1.value;

输出:

| NO | CATEGORY | VALUE | SUMS |
--------------------------------
|  1 |        1 |  2000 | 2000 |
|  2 |        1 |  1000 | 3000 |
|  3 |        2 |   500 |  500 |
|  4 |        3 |  3000 | 3000 |
|  5 |        1 |  2000 | 5000 |
|  6 |        2 |  -500 |    0 |
|  7 |        3 |  5000 | 8000 |
|  8 |        1 | -1000 | 4000 |

请参阅this SQLFiddle

答案 1 :(得分:0)

您需要的是计算滚动总数。 我知道的SQL Server 2005/2008 / 2008 R2中最快的方法如下所述:https://stackoverflow.com/a/13744550/1744834。您必须在每个类别中包含唯一的secuential列才能使用此方法,如下所示:

create table #t (no int, category int, value int, id int, primary key (category, id))

insert into #t (no, category, value, id)
select no, category, value, row_number() over (partition by category order by no)
from test

;with 
CTE_RunningTotal
as
(
    select T.no, T.category, T.value, cast(T.value as decimal(29, 10)) as total_value, T.id
    from #t as T
    where T.id = 1
    union all
    select T.no, T.category, T.value, cast(T.value + C.total_value as decimal(29, 10)) as total_value, T.id
    from CTE_RunningTotal as C
        inner join #t as T on T.id = C.id + 1 and T.category = C.category
)
select C.no, C.category, C.value, C.value
from CTE_RunningTotal as C
option (maxrecursion 0)

SQL FIDDLE EXAMPLE

你也可以使用更短的查询,但性能更差(我认为它对于递归CTE来说是O(N ^ 2)对O(N)):

select t1.no, t1.category, t1.value, sum(t2.value)
from test as t1
    inner join test as t2 on t2.category = t1.category and t2.no <= t1.no
group by t1.no, t1.category, t1.value
order by t1.no

SQL FIDDLE EXAMPLE

答案 2 :(得分:-1)

您可以使用以下sql函数SQL functions它向您展示如何使用它以及如何应用它