Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Нарастающий итог по месяцам за несколько лет одним запросом ?! / 6 сообщений из 6, страница 1 из 1
28.08.2002, 12:08:59
    #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
28.08.2002, 12:44:00
    #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
28.08.2002, 12:44:10
    #32046484
Дед Маздай
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нарастающий итог по месяцам за несколько лет одним запросом ?!
Посмотрите, например, здесь
...
Рейтинг: 0 / 0
28.08.2002, 13:35:47
    #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
28.08.2002, 17:40:00
    #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
28.08.2002, 18:36:05
    #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
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Нарастающий итог по месяцам за несколько лет одним запросом ?! / 6 сообщений из 6, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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