2013-12-13 145 views
0

我在表中具有特定于特定级别的代码和附加到该级别的数量的记录。他们不加起来,这不是问题。创建累计汇总

我希望创建一个查询,通过级别代码加上所有值加上它下面的级别。我还想在同一个查询中的每个级别的金额,但这不是必需的。我已经创建了一个示例表并在下面输出。有没有人有这样做的好方法?另外,是否有这种卷起的实际定义?

CREATE TABLE LEVEL_AMOUNTS(
    LEVEL_CODE char(1) 
    AMOUNT  integer 
) 
INSERT INTO LEVEL_AMOUNTS VALUES 
('A',1),('A',1),('A',1),('A',1), 
('B',1),('B',1),('B',1),('B',1), 
('C',1),('C',1),('C',1),('C',1) 

输出:

A | 12 
B | 8 
C | 4 
+0

我没有指定一个不能使用的水平代码的ASCII值对它们进行排序或代码的特定ID。 – user1281598

+0

那么你能指定你想要“真正”的积累?什么是“订单”? –

+0

因为你也可以在'nvarchar'上设置'<='。例如,“asdf”小于“asde”或“bsdf” –

回答

0
with cte as (
     select distinct level_code 
     from level_amounts 
    ) 
select l.level_code, sum(l.amount) 
from cte 
inner join level_amounts l on l.level_code <= cte.level_code 
group by l.level_code 

select l.level_code, sum(l.amount) 
from level_amounts l 
inner join (select distinct level_code 
      from level_amounts) l1 
on l.level_code <= l1.level_code 
group by l.level_code; 

sqlfiddle

+0

我应该指出,虽然我明白如何使用ascii值的顺序会起作用,但是我的级别代码不是按字母顺序排列,并非全部都是1个字符。 – user1281598

+0

@ user1281598正确,也可以订购更大的字符串。你可以选择用来使'<='连接的字段... –

0

SQL Server 2008中没有累积和。您可以使用子查询做到这一点或加入:

with cte as (
     select level_code, sum(amount) as amount 
     from amounts 
     group by level_code 
    ) 
select level_code, 
     (select sum(amount) from cte cte2 where cte.level_code <= cte2.level_code) as cumamount 
from cte;