|
|
|
Нарастающий итог по месяцам за несколько лет одним запросом ?!
|
|||
|---|---|---|---|
|
#18+
Есть таблица 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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.08.2002, 12:08:59 |
|
||
|
Нарастающий итог по месяцам за несколько лет одним запросом ?!
|
|||
|---|---|---|---|
|
#18+
Я вот как сделал : Код: 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. PS Запрос не дешевый, т.к. содержит коррелированный подзапрос. Более того, при таких объемах, как ты заявил, будет тормозить жутко. Чтобы хоть как-то его оптимизировать , нужно погонять его из под Index Tuning Wizard. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.08.2002, 12:44:00 |
|
||
|
Нарастающий итог по месяцам за несколько лет одним запросом ?!
|
|||
|---|---|---|---|
|
#18+
Посмотрите, например, здесь ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.08.2002, 12:44:10 |
|
||
|
Нарастающий итог по месяцам за несколько лет одним запросом ?!
|
|||
|---|---|---|---|
|
#18+
А так? [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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.08.2002, 13:35:47 |
|
||
|
Нарастающий итог по месяцам за несколько лет одним запросом ?!
|
|||
|---|---|---|---|
|
#18+
Это точно работающий вариант. Преимущество работы через временную таблицу и 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.08.2002, 17:40:00 |
|
||
|
Нарастающий итог по месяцам за несколько лет одним запросом ?!
|
|||
|---|---|---|---|
|
#18+
Вот еще вариантец 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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.08.2002, 18:36:05 |
|
||
|
|

start [/forum/topic.php?fid=46&msg=32046483&tid=1820766]: |
0ms |
get settings: |
4ms |
get forum list: |
13ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
66ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
29ms |
get tp. blocked users: |
1ms |
| others: | 208ms |
| total: | 336ms |

| 0 / 0 |
