2013-02-19 3 views
13

Привет У меня есть столбец с именем Кол-во из таблицы Bills я хочу столбец, показать бегущую сумму столбца Кол-во вроде этого:Как получить работает сумму столбца в SQL сервере

Qty Run_Sum 
1  1 
2  3 
3  6 
4  10 
5  15 

Предлагай меня некоторые подходящий метод, чтобы запустить некоторые Thankx

+0

Как это работает? 1 1 2 3 5 8 13 21 34 ..... [Серия фибоначчи] будет примером текущей суммы. – Achrome

+1

Какие [RDBMS] (http://en.wikipedia.org/wiki/Relational_database_management_system) вы используете? 'SQL Server'? 'MySQL'? 'Oracle'? 'DB2'? и т. д. –

+0

Я использую сервер sql 2008 – user1448783

ответ

12

, если RDBMS поддерживает функцию окна,

для SQL Server 2012

SELECT Qty, 
     SUM(Qty) OVER (ORDER BY Qty) AS CumulativeTOTAL 
FROM tableName 

для SQL Server 2008

SELECT a.Qty, (SELECT SUM(b.Qty) 
       FROM TableName b 
       WHERE b.Qty <= a.Qty) 
FROM TableName a 
ORDER BY a.Qty; 
+0

Я думаю, что подзапрос будет медленным – vikas

1

Вот пример с использованием Oracle/аналитических функций:

select id, qty, sum(qty) over(order by id asc) run_sum 
from test; 

http://www.sqlfiddle.com/#!4/3d149/1

+0

Дорогой, я использую sql-сервер, пожалуйста, предоставьте пример кода в sql-сервере – user1448783

+0

, это работает только для SQL Server 2012. –

+0

Да, спасибо, что указали это. Вот обновленный запрос (http://www.sqlfiddle.com/#!3/6ac1f/5): 'select id, qty, (выберите сумму (qty) из теста где id <= t.id) run_sum из теста t; ' –

12

SQLFiddle demo

SELECT Qty, 
SUM(Qty) OVER (ORDER BY Qty) Run_Sum 
FROM t ORDER BY Qty 

Для SQLServer до 2012:

select Qty, 
(select sum(Qty) from t where Qty<=t1.Qty) 
from t t1 order by Qty 

SQLFiddle demo

Или же вы можете сделать это без подзапроса:

select t1.Qty, sum(t2.Qty) 
from t t1 
join t t2 on (t1.Qty>=t2.Qty) 
group by t1.Qty 
order by t1.Qty 

SQLFiddle demo

+0

это работает только для SQL Server 2012, а не ниже. –

+0

@JW: и Oracle, и DB2 и Postgres, ... –

+0

добавлен запрос для предыдущих версий SQLServer – valex

0

Проверить этот

DECLARE @TEMP table 
(
    ID int IDENTITY(1,1), 
    QUANTITY int 
) 

INSERT INTO @TEMP 
SELECT 1 UNION ALL 
SELECT 2 UNION ALL 
SELECT 3 UNION ALL 
SELECT 4 UNION ALL 
SELECT 8 UNION ALL 
SELECT 7 UNION ALL 
SELECT 5 UNION ALL 
SELECT 1 

SELECT t.QUANTITY AS Qty, SUM(t1.QUANTITY) AS Run_Sum 
FROM @TEMP t 
INNER JOIN @TEMP t1 
ON t1.ID <= t.ID 
GROUP BY t.ID, t.QUANTITY 
ORDER BY t.ID 
0
;with cte as (
    select top 1 Qty, Qty as RunningSum 
    from Bills 
    order by Qty 

    union all 

    select t.Qty, cte.RunningSum + t.Qty 
    from cte 
    inner join Bills t on cte.Qty + 1 = t.Qty 
) 
select * from cte 
+0

Это неправильный ответ. – Varun

0

@mahmud: Посмотрите, что это дает

DECLARE @Bills table 
(
    QUANTITY int 
) 

INSERT INTO @Bills 
SELECT 2 UNION ALL 
SELECT 6 UNION ALL 
SELECT 7 UNION ALL 
SELECT 1 UNION ALL 
SELECT 3 UNION ALL 
SELECT -5 UNION ALL 
SELECT 5 UNION ALL 
select 1 

;with cte as (
    select top 1 QUANTITY, QUANTITY as RunningSum 
    from @Bills 
    order by QUANTITY 

    union all 

    select t.QUANTITY, cte.RunningSum + t.QUANTITY 
    from cte 
    inner join @Bills t on cte.QUANTITY + 1 = t.QUANTITY 
) 
select * from cte 
Смежные вопросы