2013-12-13 2 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 кода уровня, чтобы заказать их или конкретный идентификатор кода. – 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

@ пользователь1281598 правая, более крупная строка также может быть заказана. И вы можете выбрать поля, используемые для создания '<=' join ... –

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; 
Смежные вопросы