powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Нарастающий итог по месяцам за несколько лет одним запросом ?!
6 сообщений из 6, страница 1 из 1
Нарастающий итог по месяцам за несколько лет одним запросом ?!
    #32046475
Igr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Igr
Гость
Есть таблица
CREATE TABLE [__temptest] (
[id] [int] IDENTITY (1, 1) NOT NULL ,
[date] [datetime] NULL ,
[rub] [int] NULL ,
CONSTRAINT [PK___temptest] PRIMARY KEY CLUSTERED
(
[id]
) ON [PRIMARY]
) ON [PRIMARY]
GO
В таблице например такие значения -
____date__|_rub_______
2000-01-01 | 1
2000-01-02 | 2
2000-01-03 | 3
2000-01-04 | 4
2000-01-05 | 5
2001-03-01 | 1
2001-03-02 | 2
2002-02-01 | 1
2002-02-02 | 2
2002-02-02 | 3
2002-02-03 | 4
2002-02-03 | 5
2002-02-04 | 6

Не удается одним и дешевым запросом получить нарастающий итог по месяцам, по полю rub
(выборка осушествляется по большому количеству записей - порядка 2600000)

Нарастающий итог - результат который следует получить :
____date__|_rub_______
2000-01-01 | 1
2000-01-02 | 3
2000-01-03 | 6
2000-01-04 | 10
2000-01-05 | 15
2001-03-01 | 1
2001-03-02 | 3
2002-02-01 | 1
2002-02-02 | 3
2002-02-02 | 6
2002-02-03 | 10
2002-02-03 | 15
2002-02-04 | 21
...
Рейтинг: 0 / 0
Нарастающий итог по месяцам за несколько лет одним запросом ?!
    #32046483
Фотография Jimmy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я вот как сделал :
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
 /* 
Для простоты оперирования датами, в тех случаях
когда не нужно учитывать время, я храню дату
в строке char(8) в формате ANSI, который прекрасно
понимается сервером и такие строки автоматически 
преобразуются к типу datetime в выражениях с 
переменными типа datetime.
*/ 
create table testsum (id int identity( 1 , 1 ), date char( 8 ), rub int)
go
insert testsum (date,rub)
	values ('20000101',  1 )
insert testsum (date,rub)
	values ('20000102',  2 )
insert testsum (date,rub)
	values ('20000103',  3 )
insert testsum (date,rub)
	values ('20000104',  4 )
insert testsum (date,rub)
	values ('20000105',  5 )
insert testsum (date,rub)
	values ('20010301',  1 ) 
insert testsum (date,rub)
	values ('20010302',  2 )
insert testsum (date,rub)
	values ('20020201',  1 )
insert testsum (date,rub)
	values ('20020202',  2 )
insert testsum (date,rub)
	values ('20020202',  3 )
insert testsum (date,rub)
	values ('20020203',  4 )
insert testsum (date,rub)
	values ('20020203',  5 )
insert testsum (date,rub)
	values ('20020204',  6 )
go
select t1.date, rub=
	(select sum(rub) from testsum where date <= t1.date and left(date, 6 )=left(t1.date, 6 ))
from (select distinct date from testsum) t1
order by  1 
go

 --- results ---
 
date     rub         
 -------- ----------- 
 
 20000101   1 . 00 
 20000102   3 . 00 
 20000103   6 . 00 
 20000104   10 . 00 
 20000105   15 . 00 
 20010301   1 . 00 
 20010302   3 . 00 
 20020201   1 . 00 
 20020202   6 . 00 
 20020203   15 . 00 
 20020204   21 . 00 

( 11  row(s) affected)




PS Запрос не дешевый, т.к. содержит коррелированный подзапрос. Более того, при таких объемах, как ты заявил, будет тормозить жутко. Чтобы хоть как-то его оптимизировать , нужно погонять его из под Index Tuning Wizard.
...
Рейтинг: 0 / 0
Нарастающий итог по месяцам за несколько лет одним запросом ?!
    #32046484
Фотография Дед Маздай
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Посмотрите, например, здесь
...
Рейтинг: 0 / 0
Нарастающий итог по месяцам за несколько лет одним запросом ?!
    #32046505
Tulkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А так?
[src][/src]
create table testsum (date char(8), rub int,summ int null)
go
insert testsum (date,rub)
values ('20000101', 1)
insert testsum (date,rub)
values ('20000102', 2)
insert testsum (date,rub)
values ('20000103', 3)
insert testsum (date,rub)
values ('20000104', 4)
insert testsum (date,rub)
values ('20000105', 5)
insert testsum (date,rub)
values ('20010301', 1)
insert testsum (date,rub)
values ('20010302', 2)
insert testsum (date,rub)
values ('20020201', 1)
insert testsum (date,rub)
values ('20020202', 2)
insert testsum (date,rub)
values ('20020202', 3)
insert testsum (date,rub)
values ('20020203', 4)
insert testsum (date,rub)
values ('20020203', 5)
insert testsum (date,rub)
values ('20020204', 6)

select * into #t from testsum order by date
declare @a int
select @a=0
update #t set @a=@a+rub
...
Рейтинг: 0 / 0
Нарастающий итог по месяцам за несколько лет одним запросом ?!
    #32046615
Это точно работающий вариант. Преимущество работы через временную таблицу и UPDATE - линейная зависимость от количества записей в таблице.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
CREATE TABLE #testsum ( 
  id int IDENTITY ( 1 ,  1 ) NOT NULL, 
  date datetime NULL, 
  rub int NULL,
  PRIMARY KEY CLUSTERED (id)
)
GO

SET NOCOUNT ON
SET DATEFORMAT ymd

INSERT #testsum (date, rub) VALUES ('2000-01-01',  1 ) 
INSERT #testsum (date, rub) VALUES ('2000-01-02',  2 ) 
INSERT #testsum (date, rub) VALUES ('2000-01-03',  3 ) 
INSERT #testsum (date, rub) VALUES ('2000-01-04',  4 ) 
INSERT #testsum (date, rub) VALUES ('2000-01-05',  5 ) 
INSERT #testsum (date, rub) VALUES ('2001-03-01',  1 ) 
INSERT #testsum (date, rub) VALUES ('2001-03-02',  2 ) 
INSERT #testsum (date, rub) VALUES ('2002-02-01',  1 ) 
INSERT #testsum (date, rub) VALUES ('2002-02-02',  2 ) 
INSERT #testsum (date, rub) VALUES ('2002-02-02',  3 ) 
INSERT #testsum (date, rub) VALUES ('2002-02-03',  4 ) 
INSERT #testsum (date, rub) VALUES ('2002-02-03',  5 ) 
INSERT #testsum (date, rub) VALUES ('2002-02-04',  6 ) 

SELECT * INTO #t FROM #testsum ORDER BY date

DECLARE
@iTemp int,
@iTemp2 int,
@iMonth int

SELECT @iTemp =  0 
SELECT @iTemp2 =  0 
SELECT @iMonth =  0 

UPDATE #t SET rub = rub + @iTemp, @iTemp  = @iTemp2,
    @iTemp2 = CASE WHEN @iMonth != Month(Date) + Year(Date) *  12  THEN rub ELSE @iTemp2 + rub END,
    @iMonth = Month(Date) + Year(Date) *  12 

SELECT * FROM #t

DROP TABLE #testsum
DROP TABLE #t
...
Рейтинг: 0 / 0
Нарастающий итог по месяцам за несколько лет одним запросом ?!
    #32046637
Denisco
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот еще вариантец
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[testsum]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table testsum
GO
create table testsum (id int identity(1,1), date char(8), rub int)

insert testsum (date,rub)
values ('20000101', 1)
insert testsum (date,rub)
values ('20000102', 2)
insert testsum (date,rub)
values ('20000103', 3)
insert testsum (date,rub)
values ('20000104', 4)
insert testsum (date,rub)
values ('20000105', 5)
insert testsum (date,rub)
values ('20010301', 1)
insert testsum (date,rub)
values ('20010302', 2)
insert testsum (date,rub)
values ('20020201', 1)
insert testsum (date,rub)
values ('20020202', 2)
insert testsum (date,rub)
values ('20020202', 3)
insert testsum (date,rub)
values ('20020203', 4)
insert testsum (date,rub)
values ('20020203', 5)
insert testsum (date,rub)
values ('20020204', 6)


create table #tmp
(
y int,
m int,
cnt float
)
insert into #tmp select year(t1.date) as y,month(t1.date) as m,(select sum(rub) from testsum where date<=t1.date ) as cnt from testsum t1
--select sum(rub),month(date) as m from testsum group by month(date)
select distinct m,y, (select max(cnt) from #tmp where y=t1.y and m=t1.m) from #tmp as t1
drop table #tmp

--reuslt
m y cnt
1 2000 15
2 2002 39
3 2001 18
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Нарастающий итог по месяцам за несколько лет одним запросом ?!
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]