Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

[MSSQL] Sumowanie narastające danych w poszczególnych kolumnach.

1,255 views
Skip to first unread message

grzehorz

unread,
Jun 11, 2013, 4:56:16 AM6/11/13
to
Są w tabeli dokumenty z ilościami z dokumentów.
Może mnie ktoś oświecić jak można obliczyć w poszczególnych
kolumnach narastająco sumę poprzednich wierszy?...
Mam coś takiego:
WZ1 10
WZ2 3
WZ3 12
WZ4 1

I chciałbym uzyskać:
WZ1 10 10
WZ2 3 13
WZ3 12 25
WZ4 1 26

Czytałem o klauzuli OVER, ale chyba nie bardzo to rozumiem,
albo może jakoś to da się prościej, albo to może nie ten kierunek... :/

Pozdrawiam
g.

PaSkol

unread,
Jun 11, 2013, 2:20:41 PM6/11/13
to
W dniu 2013-06-11 10:56, grzehorz pisze:

> Mam coś takiego:
> WZ1 10
> WZ2 3
> WZ3 12
> WZ4 1
>
> I chciałbym uzyskać:
> WZ1 10 10
> WZ2 3 13
> WZ3 12 25
> WZ4 1 26
>
> Czytałem o klauzuli OVER, ale chyba nie bardzo to rozumiem,

W tym szczególnym wypadku masz 2 rozwiązania:
1 - kursor.
2 - update na tabeli, np.:

if OBJECT_ID('tempdb..#T') is not null
drop table #T;
create table #T (symbol varchar(10), value int, total int)
declare @Count int = 160160;
while @Count > 0
begin
set @Count = @Count - 1;
insert into #T
values ('W' + LTrim(Str(@Count)), @Count % 2 + 1, null);
end;

declare @total int = 0;
update T1
set @total = @total + T1.value, total = @total
from #T T1

select * from #T;


Wszelkie inne rozwiązania będą wysoce niewydajne.

--
PaSkol

ktos

unread,
Jun 11, 2013, 3:33:16 PM6/11/13
to
W dniu 2013-06-11 10:56, grzehorz pisze:

Wg podręcznika do SQl-a 2012 powinno byc tak:

select wz,ilosc,suma=SUM(ilosc) OVER(ORDER BY wz ROWS UNBOUNDED PRECEDING)
from ....
order by wz

grze...@gmail.com

unread,
Jun 11, 2013, 4:19:38 PM6/11/13
to
Nie jestem orłem ani sokołem SQLa, więc poradziłem sobie tak:
select
wz,
ilosc,
(select sum(ilosc) from dok as d where d.wz=dok.wz) as suma
from
dok

Mam zmajstrować jedno zestawienie, więc raczej nieładnie się zachowuję
i szukam czegoś prostego a nie wydajnego...

Pozdrawiam
g.

grze...@gmail.com

unread,
Jun 11, 2013, 4:22:43 PM6/11/13
to
W dniu wtorek, 11 czerwca 2013 21:33:16 UTC+2 użytkownik ktos napisał:
> W dniu 2013-06-11 10:56, grzehorz pisze:
>
> Wg podręcznika do SQl-a 2012 powinno byc tak:
>
> select wz,ilosc,suma=SUM(ilosc) OVER(ORDER BY wz ROWS UNBOUNDED PRECEDING)
> from ....
> order by wz
>

:/
No i tyle mi na to powiedział:

[MODBCDRV/16954] Informacja
[01000] [Microsoft][SQL Server Native Client 10.0][SQL Server]Executing SQL directly; no cursor.
[MODBCDRV/102] Informacja
[37000] [Microsoft][SQL Server Native Client 10.0][SQL Server]Incorrect syntax near 'ROWS'.

--
Pozdrawiam
g.

ktos

unread,
Jun 11, 2013, 6:32:45 PM6/11/13
to
Może niejasno napisałem, że to dotyczy 2012 (albo inaczej 11.0).

Wklejone z Management Studio:

USE [Rejestr_Ofert]
GO

select nr_wz,ilosc,suma=SUM(ilosc) OVER(ORDER BY nr_wz ROWS UNBOUNDED
PRECEDING)
from wz
order by nr_wz

i wynik:

WZ1 10 10
WZ2 3 13
WZ3 12 25
WZ4 1 26




W dniu 2013-06-11 22:22, grze...@gmail.com pisze:

grzehorz

unread,
Jun 11, 2013, 6:39:22 PM6/11/13
to
W dniu środa, 12 czerwca 2013 00:32:45 UTC+2 użytkownik ktos napisał:

>
> Może niejasno napisałem, że to dotyczy 2012 (albo inaczej 11.0).
>
> Wklejone z Management Studio:
>
> USE [Rejestr_Ofert]
> GO
>
> select nr_wz,ilosc,suma=SUM(ilosc) OVER(ORDER BY nr_wz ROWS UNBOUNDED
> PRECEDING)
> from wz
> order by nr_wz
>
> i wynik:
>
> WZ1 10 10
> WZ2 3 13
> WZ3 12 25
> WZ4 1 26
>

Nic to, ja też nie napisałem, że potrzebne mi to do 2008.

--
Pozdrawiam
g.
0 new messages