2013-02-19 14 views
13

Witam mam kolumnę o nazwie Ilość od Bills stołowych chcę kolumny, które pokazują sumę obrotowej kolumnie Qty takiego:Jak zdobyć działa sumę kolumny w serwerze sql

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

zasugerować mi jakiś odpowiedni sposób, aby korzystanie z niektórych thankx

+0

Jak to działa? 1 1 2 3 5 8 13 21 34 ..... [Seria fibonacci] byłaby przykładem sumy bieżącej. – Achrome

+1

Jakiego [RDBMS] (http://en.wikipedia.org/wiki/Relational_database_management_system) używasz? 'SQL Server'? 'MySQL'? 'Oracle'? 'DB2'? etc .. –

+0

Używam serwera sql 2008 – user1448783

Odpowiedz

12

jeśli RDBMS obsługuje funkcję okna,

za SQL Server 2012

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

do 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

Myślę, że podzapytanie byłoby powolne – vikas

1

Oto przykład przy użyciu Oracle/funkcje analityczne:

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

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

+0

Drogi, używam serwera sql proszę podać przykładowy kod w serwerze sql – user1448783

+0

to działa tylko dla serwera sql 2012. –

+0

Tak, dziękuję za wskazanie tego. Oto zaktualizowane zapytanie (http://www.sqlfiddle.com/#!3/6ac1f/5): 'wybierz id, qty, (wybierz sumę (qty) z testu gdzie id <= t.id) run_sum z testu t; ' –

12

SQLFiddle demo

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

Dla SQLServer przed 2012:

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

SQLFiddle demo

Albo też można to zrobić bez podzapytaniu:

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

działa to tylko dla serwera sql 2012, a nie poniżej. –

+0

@JW: i Oracle oraz DB2 i Postgres, ... –

+0

dodano zapytanie do wcześniejszych wersji SQLServer – valex

0

Sprawdź tę

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

To nie jest poprawna odpowiedź. – Varun

0

@mahmud: zobaczyć, co daje

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 
Powiązane problemy